Community
    • Login

    Negative lookbehind regular expression not working on Notepad++

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    43 Posts 6 Posters 1.1k 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.
    • mpheathM
      mpheath @dr ramaanand
      last edited by mpheath

      @dr-ramaanand said in Negative lookbehind regular expression not working on Notepad++:

      @PeterJones You may want to study what is mentioned at https://www.rexegg.com/regex-lookarounds.php to understand how to use your method of regular expression for multiple negative look behinds. This is the specific regular expression I believe can help: (?<=(?<!(?<!X)_)_)\d+

      Please explain why as I am not a believer.

      To be more explicit in detail, you have an issue and now you consider nested within nested within nested regular expression is a solution to your problem?

      1 Reply Last reply Reply Quote 2
      • PeterJonesP
        PeterJones @guy038
        last edited by

        @guy038 said in Negative lookbehind regular expression not working on Notepad++:

        you could mainly use the general template, below :

        @guy038 , that’s an awesome template.

        I highly encourage you to write up a short blog post about it, and then link to that new post from the Generic Regex Formula FAQ, because I think that’s a formula that could end up being useful.

        (I would just link to your post in here, but the focus is this particular example, which I think would be too complicated for most readers to understand. Doing a simpler example in the blog would be useful, I think, to help people translate your “template” into a real regex.)

        dr ramaanandD 1 Reply Last reply Reply Quote 2
        • dr ramaanandD
          dr ramaanand @PeterJones
          last edited by dr ramaanand

          @PeterJones I have understood what @guy038 is trying to convey (and I have been using it). A template would be useful and this is an example: (xyz)(*SKIP)(*F)|(z) is like a negative look behind which skips finding any z if it is preceded by y or x (the order of the x and y need not be the same) but finds all other occurrences of z - post no.16 shows how he used it for the block I typed for testing at the top of this thread

          I would prefer a template like this:-

          (String1|String2)(MAIN Regex Search)(*SKIP)(*F)|(MAIN Regex Search)
                                                         |
          <------------- This I do NOT want ------------><- This I DO want ->
          
          dr ramaanandD 1 Reply Last reply Reply Quote 0
          • dr ramaanandD
            dr ramaanand @dr ramaanand
            last edited by dr ramaanand

            @PeterJones We can add another line below the above RegEx explanation like this (to explain it better):-

            <------------- What I want to SKIP ------------><- What I want to MATCH ->
            
            dr ramaanandD 1 Reply Last reply Reply Quote 1
            • dr ramaanandD
              dr ramaanand @dr ramaanand
              last edited by dr ramaanand

              @PeterJones The wonderful thing about the (*SKIP)(*F) method is that it can be used for negative look aheads also like this:-

              (MAIN Regex Search)(String1|String2)(*SKIP)(*F)|(MAIN Regex Search)
                                                             |
              <------------- What I want to SKIP ------------><-What I want to MATCH->
              
              PeterJonesP 1 Reply Last reply Reply Quote 0
              • PeterJonesP
                PeterJones @dr ramaanand
                last edited by

                @dr-ramaanand said in Negative lookbehind regular expression not working on Notepad++:

                The wonderful thing about the (*SKIP)(*F) method is that it can be used for negative look aheads also like this

                But pointless, because lookaheads (negative or positive) can have variable width, so if you want a lookahead, just use a lookahead.

                dr ramaanandD 1 Reply Last reply Reply Quote 2
                • dr ramaanandD
                  dr ramaanand @PeterJones
                  last edited by

                  @PeterJones The (*SKIP)(*F) method can be of variable width but it can be used only for negative look aheads and negative look behinds

                  Alan KilbornA 1 Reply Last reply Reply Quote 0
                  • Alan KilbornA
                    Alan Kilborn @dr ramaanand
                    last edited by

                    @dr-ramaanand

                    Peter’s last point (which you missed) was that lookaheads are best done with native regex syntax, because it is more obvious that way.

                    And he probably would have confused you less if he had left out (negative or positive) from his sentence; doing that doesn’t change the meaning.

                    1 Reply Last reply Reply Quote 3
                    • guy038G
                      guy038
                      last edited by guy038

                      Hello, @peterjones and All,

                      OK. I going to prepare a blog post regarding the (*SKIP)(*F) feature !

                      However, be patient because I’ll try, first :

                      • To find out some other pertinent examples from various regex sites

                      • To propose alternatives to the (*SKIP)(*F) syntax when it’s possible !

                      BR

                      guy038

                      dr ramaanandD 1 Reply Last reply Reply Quote 3
                      • dr ramaanandD
                        dr ramaanand @guy038
                        last edited by dr ramaanand

                        @guy038 please create the blog to show how to use the (*SKIP)(*FAIL) regular expression, not an alternative to it. @PeterJones may be able to create an alternative to it. If @PeterJones wants to still use his method for what I have typed as my block for testing, he can do it in 2 parts; first using the regular expression, (<span\b[^>]*?color\s*:\s*black[^>]*>\s*|<p\b[^>]*?color\s*:\s*black[^>]*>\s*<span\b[^>]*>\s*)\K(<code\s*style="background-color:\s*transparent;">) in the find field and a unique string (say for example, a unique name like, “Czeslawski”) in the replace field, he can replace the <code\s*style="background-color:\s*transparent;"> with that unique string. Then he can do what is needed to the other strings of <code\s*style="background-color:\s*transparent;"> and then again replace the unique string (“Czeslawski” in this case) with <code\s*style="background-color:\s*transparent;">. If it is something simple, this example should be sufficient: https://stackoverflow.com/questions/17286667/regular-expression-using-negative-lookbehind-not-working-in-notepad

                        1 Reply Last reply Reply Quote 0
                        • guy038G
                          guy038
                          last edited by

                          Hello, @dr-ramaanand,

                          When I said :

                          To propose alternatives to the (*SKIP)(*F) syntax when it’s possible !

                          I’m not talking about a work-around, using a several-steps regex, but, indeed, other direct regexes, without the (*SKIP)(*F) syntax, which are, sometimes, even shorter !

                          You’ll understand what I mean., sooner !

                          Best Regards,

                          guy038

                          dr ramaanandD 1 Reply Last reply Reply Quote 1
                          • dr ramaanandD
                            dr ramaanand @guy038
                            last edited by

                            @guy038 I will understand it only after you post that regular expression (RegEx) here

                            dr ramaanandD 1 Reply Last reply Reply Quote 0
                            • dr ramaanandD
                              dr ramaanand @dr ramaanand
                              last edited by

                              This post is deleted!
                              1 Reply Last reply Reply Quote 0
                              • guy038G
                                guy038
                                last edited by

                                Hello, @peterjones and All,

                                Peter, Done ! Refer to :

                                https://community.notepad-plus-plus.org/topic/26812/generic-regex-how-to-use-the-couple-of-backtracking-control-verbs-skip-fail-or-skip-f-in-regexes

                                I also added a link to this post in your FAQ: Generic Regular Expression (regex) Formulas post.

                                Best Regards,

                                guy038

                                dr ramaanandD 1 Reply Last reply Reply Quote 3
                                • dr ramaanandD
                                  dr ramaanand @guy038
                                  last edited by dr ramaanand

                                  @guy038 So, if you have an alternative method to the (*SKIP)(*FAIL) method for the block posted right at the top of this thread for testing to match the same string you posted in post#16 above, please post it here

                                  dr ramaanandD 1 Reply Last reply Reply Quote 0
                                  • dr ramaanandD
                                    dr ramaanand @dr ramaanand
                                    last edited by dr ramaanand

                                    @guy038 you can use the idea mentioned at www.drregex.com/2019/02/variable-length-lookbehinds-actually.html?m=1 if you please, for the above RegEx. @PeterJones can include that formula in the Notepad++ manual also, if he pleases.

                                    Alan KilbornA 1 Reply Last reply Reply Quote 0
                                    • Alan KilbornA
                                      Alan Kilborn @dr ramaanand
                                      last edited by Alan Kilborn

                                      @dr-ramaanand said:

                                      www.drregex.com/2019/02/variable-length-lookbehinds-actually.html?m=1

                                      Doesn’t appear to be a valid link, in fact, it seems to point back to the N++ Community site??

                                      THIS is probably the correct link.

                                      dr ramaanandD 1 Reply Last reply Reply Quote 1
                                      • dr ramaanandD
                                        dr ramaanand @Alan Kilborn
                                        last edited by dr ramaanand

                                        @guy038 The answer by User Doqnach mentioned at https://stackoverflow.com/questions/25563891/variable-length-look-behind can be used as an example.

                                        Alan KilbornA 1 Reply Last reply Reply Quote 0
                                        • Alan KilbornA
                                          Alan Kilborn @dr ramaanand
                                          last edited by

                                          @dr-ramaanand said:

                                          The answer by User Doqnach mentioned at … can be used as an example.

                                          Well, trying that (/(?=(?=(?'a'[\s\S]*))(?'b'eat_(?:apple|pear|orange)_(?=\k'a'\z)|(?<=(?=x^|(?&b))[\s\S])))today|yesterday) in Notepad++ yields:

                                          bf2380ce-2d50-4d34-8670-d833b3f43479-image.png

                                          This is an error message I don’t think I’ve seen before.

                                          Note that I tried it on a smallish file where nothing would have matched.

                                          dr ramaanandD 1 Reply Last reply Reply Quote 0
                                          • dr ramaanandD
                                            dr ramaanand @Alan Kilborn
                                            last edited by dr ramaanand

                                            @Alan-Kilborn That RegEx should be (?=(?=(?'a'[\s\S]*))(?'b'eat_(?:apple|pear|orange)_(?=\k'a'\z)|(?<=(?=x^|(?&b))[\s\S])))today|yesterday - I corrected it on stackoverflow but my edit is awaiting moderation (others can see it with my corrections only after my edit gets approved). For your information, those are positive look behinds with a capture group named ‘a’ and a capture group named ‘b’ and need to be changed to negative look behinds. I am unable to skip anything with this or this. I want the result to be like in post#16

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