• Login
Community
  • Login

Finding sentences with open parenthesis that and not closed

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
14 Posts 3 Posters 2.8k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S
    Scott Sumner @Robin Cruise
    last edited by Jul 8, 2018, 4:11 PM

    @Robin-Cruise

    Perhaps something like this, if your ( and your sentence-ender (e.g. ? but also could include . or ! or…) is on the same line:

    Find-what zone: (?-s)\(.+?[?!.]
    Replace-with zone: $0\)
    Search mode: Regular expression

    S 1 Reply Last reply Jul 8, 2018, 4:25 PM Reply Quote 0
    • S
      Scott Sumner @Scott Sumner
      last edited by Jul 8, 2018, 4:25 PM

      Ach…that doesn’t seem to quite do it…maybe this one is better:

      Find-what zone: (?-s)\(.+?(?:(\))|[.?!])(?!\))
      Replace-with zone: $0?1:\)

      …or maybe I should just give up… :-)

      1 Reply Last reply Reply Quote 1
      • R
        Robin Cruise
        last edited by Robin Cruise Jul 8, 2018, 4:31 PM Jul 8, 2018, 4:28 PM

        hello Scott Sumner. Thanks for answer. Your regex seems to be fine for my exemple, but it’s not about search and replace, only search I need.

        because in another case, such as this:

        What is taxe d'habitation and (do I have to pay its products anytime?

        your regex will add a close parenthesis of the end of sentence (but not where I want it). Not so good. So I need only to find the sentences with open parenthesis that and not closed. Just to find them, not to close them.

        S 1 Reply Last reply Jul 8, 2018, 7:19 PM Reply Quote 1
        • G
          guy038
          last edited by guy038 Jul 8, 2018, 6:48 PM Jul 8, 2018, 6:43 PM

          Hello @Robin-cruise, @scott-sumner and All,

          From your last post and assuming that :

          • A line may contain several (....) correct blocks

          • Any (....) block is contained in a single line, only

          After some tests and building complicated regexes, I thought, as you only need to perform a search, that the best regex would be, simply :

          SEARCH \([^(\r\n]*?\)|\(|\)

          This regex matches any correct (....) block OR any non-balanced ( OR ) parenthesis !

          Remark : As correct blocks are searched first, this, automatically, avoids to find their boundaries themselves. Thus, the regex engine correctly looks for any non-balanced remaining parenthesis ;-))

          Give it a try, with the sample test, below :

          This is a sentence with TWO consecutive blocks between parentheses            00 00
          This is a sentence with TWO consecutive blocks between ) parentheses          00 01
          This is a sentence with TWO consecutive ( blocks between parentheses          00 10
          This is a sentence with TWO consecutive ( blocks between ) parentheses        00 11
          
          This is a ( sentence with TWO consecutive blocks between parentheses          10 00
          This is a ( sentence with TWO consecutive blocks between ) parentheses        10 01
          This is a ( sentence with TWO consecutive ( blocks between parentheses        10 10
          This is a ( sentence with TWO consecutive ( blocks between ) parentheses      10 11
          
          This is a sentence with TWO ) consecutive blocks between parentheses          01 00
          This is a sentence with TWO ) consecutive blocks between ) parentheses        01 01
          This is a sentence with TWO ) consecutive ( blocks between parentheses        01 10
          This is a sentence with TWO ) consecutive ( blocks between ) parentheses      01 11
          
          This is a ( sentence with TWO ) consecutive blocks between parentheses        11 00
          This is a ( sentence with TWO ) consecutive blocks between ) parentheses      11 01
          This is a ( sentence with TWO ) consecutive ( blocks between parentheses      11 10
          This is a ( sentence with TWO ) consecutive ( blocks between ) parentheses    11 11
          

          Cheers,

          guy038

          1 Reply Last reply Reply Quote 1
          • S
            Scott Sumner @Robin Cruise
            last edited by Jul 8, 2018, 7:19 PM

            @Robin-Cruise said:

            but it’s not about search and replace, only search I need.

            You are right; I misread your original post. But…if someone gives you a search+replace expression, can’t you just use the search part if that’s all you want to do? :-)

            @guy038, likely overkill… :-D

            1 Reply Last reply Reply Quote 1
            • R
              Robin Cruise
              last edited by Robin Cruise Jul 8, 2018, 7:56 PM Jul 8, 2018, 7:55 PM

              thank you guy038 .

              But in case I want to find only the LINES that contains only one single parenthesis, not both of them? Like in this case:

              This is a sentence with open parentheses  ( blocks between  ... 
              This is a sentence with close parentheses  ) blocks between ...
              

              not this

              This is a ( sentence with TWO ) consecutive blocks between parentheses        11 00
              
              1 Reply Last reply Reply Quote 1
              • G
                guy038
                last edited by Jul 8, 2018, 9:13 PM

                Hi, @Robin-cruise and All,

                In case of an UNIQUE expected block of text, between parentheses, strangely, the regex seems a bit more complicated !

                SEARCH ^[^(\r\n]*\K\)|\((?!(?-s).*\))

                Notes :

                • This regex has two alternatives, separated with the | regex symbol :

                  • ^[^(\r\n]*\K\), which searches for a ) character, if NO ( character, nor \r or \n has been found, before, from beginning of current line

                  • \((?!(?-s).*\)), which searches for a ( character, if NO ) character can be found, further on, on current line

                Just test it with the sample text, below :

                This is a sentence with ONLY ONE block between parentheses          00
                This is a sentence with ONLY ONE block ) between parentheses        01
                This is a sentence ( with ONLY ONE block between parentheses        10
                This is a sentence ( with ONLY ONE block ) between parentheses      11
                
                )                                                                   01
                (                                                                   10
                ()                                                                  11
                

                Cheers,

                guy038

                1 Reply Last reply Reply Quote 1
                • R
                  Robin Cruise
                  last edited by Jul 9, 2018, 3:05 PM

                  thank you

                  1 Reply Last reply Reply Quote 0
                  • R
                    Robin Cruise
                    last edited by Robin Cruise Jul 9, 2018, 3:16 PM Jul 9, 2018, 3:14 PM

                    and on small thing, if I want to exclude all the lines that contains ); how cand I do this?

                     This is a sentence with ( ONLY ONE block  between parentheses       
                     This is a sentence with ONLY ONE block ) between parentheses
                    

                    NOT THIS:

                     This is a sentence with ONLY ONE block between parentheses  );
                    

                    I try to add this to your regex, but doesn’t work (?![\);])

                    ^[^(\r\n]*\K\)|\((?!(?-s).*\))(?![\);])

                    1 Reply Last reply Reply Quote 0
                    • G
                      guy038
                      last edited by guy038 Jul 9, 2018, 6:08 PM Jul 9, 2018, 5:57 PM

                      Hi, @Robin-cruise and All,

                      In that case, the search of the ending parenthesis ( ) ) must have the additional condition that is NOT be followed with a semicolon ( ; ). Thus, the negative look-ahead (?!;) must be added after the literal ending parenthesis \)

                      So, the regex becomes :

                      SEARCH ^[^(\r\n]*\K\)(?!;)|\((?!(?-s).*\))

                      BR

                      guy038

                      P.S. :

                      And, with the text, below :

                      This is a sentence ( with ONLY ONE block between parentheses );
                      

                      Do you expect to match the opening parenthesis ( ( ) or to ignore it ? Presently, it does not match the (, because of the regex (?!;) !

                      1 Reply Last reply Reply Quote 0
                      • R
                        Robin Cruise
                        last edited by Jul 9, 2018, 7:22 PM

                        and, in the future, if I want to use negative look-ahead for other sings like },{ or [,] what negative look-ahead should I use?

                        because, just for testing, I try to change ); with )} so as to find those lines that contains only )}

                         This is a sentence with ONLY ONE block between parentheses  )}
                        

                        so, in this case I should use something like this (?!\}), correct?

                        ^[^(\r\n]*\K\)(?!\})|\((?!(?-s).*\)) but is not working

                        1 Reply Last reply Reply Quote 0
                        • R
                          Robin Cruise
                          last edited by Robin Cruise Jul 9, 2018, 7:47 PM Jul 9, 2018, 7:46 PM

                          got it (?![\}]) or (?![\{])

                          So this will find all lines that contains only curly bracket ); or ){ or )}

                          ^[^(\r\n]*\K\)(?!;)(?![\}])(?![\{])|\((?!(?-s).*\))

                          Thank you very much Guy038

                          1 Reply Last reply Reply Quote 0
                          • G
                            guy038
                            last edited by guy038 Jul 9, 2018, 9:14 PM Jul 9, 2018, 8:55 PM

                            Hi, @Robin-cruise and All,

                            Of course, you may add these 3 look-aheads, consecutively, after the litteral \) ending parenthesis, as you did :

                            (?!;)(?![\}])(?![\{])

                            Indeed, while evaluating each condition, in each look-ahead, the regex engine location does NOT change ( It is just between the ) and its next character ! )

                            However, you can, also, use the unique look-head (?![;{}]) ! In addition, when inside a character class [....], the { and } braces are just literal characters :-))

                            Recall :

                            Inside a character class [....], 4 characters, only, have a special meaning :

                            • The character ^, which must be at any position but the first, to be considered as literal or at any position if preceded with the \ escape symbol

                            • The character ], which must be the very first character, after ], to be taken as literal or at any position if preceded with the \ escape symbol

                            • The character -, which must be at the very beginning or at the the very end of the character class to be considered as literal or at any position if preceded with the \ escape symbol

                            • The character \, which can be at any position of the character class, if preceded, itself, with an other \ escape symbol, to be taken as a literal character

                            • All the other chracters, inside a character class [....], are just literal chars !


                            To sum up, assuming an unique block (.....) per line, the regex ^[^(\r\n]*\K\)(?![;{}])|\((?!(?-s).*\)) would find :

                            • The ending ) parenthesis, if not followed with a ;, a } or a { character AND if a ( parenthesis has not been found, before, in current line

                            • The starting ( parenthesis, if a ) parenthesis cannot be found, further on, in current line

                            Cheers,

                            guy038

                            1 Reply Last reply Reply Quote 0
                            11 out of 14
                            • First post
                              11/14
                              Last post
                            The Community of users of the Notepad++ text editor.
                            Powered by NodeBB | Contributors