Community
    • Login

    With the help of a Regex, how to find "code" preceded by a "<" only if "code {" is absent between "<style" and "</style>" in the css section which is below ?

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    13 Posts 2 Posters 609 Views 1 Watching
    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.
    • dr ramaanandD Offline
      dr ramaanand @dr ramaanand
      last edited by

      I have relied on the explanation of the (*SKIP)(*FAIL) method mentioned at 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/5

      dr ramaanandD 1 Reply Last reply Reply Quote 0
      • dr ramaanandD dr ramaanand referenced this topic
      • dr ramaanandD Offline
        dr ramaanand @dr ramaanand
        last edited by dr ramaanand

        An alternative Regular expression can be to introduce a negative lookahead between .*? and the code just after it in this Regex: <code.*?code\x20\{\s*font-family

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

          Hello, @dr-ramaanand and all,

          If I assume that any line <style .....> always comes right after a line <code....>....</code>, a possible solution is :

          (?s-i)<code(?:(?!</style>).)+?</code>(?=\R<style (?:(?!code ?{).)*?</style>)

          Test it against this sample text :

          <code............>............</code>
          <style type="text/css">
          code {
            font-family: &quot;verdana&quot;;
            font-size: 19px;
            color: black;
            font-weight: bold !important;
            line-height: 1 !important;
            }
          }
          </style>
          
          <code............>............</code>
          <style type="text/css">
          </style>
          
          <code............>............</code>
          <style type="text/css">
          code{
            font-family: &quot;verdana&quot;;
            font-size: 19px;
            color: black;
            font-weight: bold !important;
            line-height: 1 !important;
            }
          }
          </style>
          
          <code............>............</code>
          <style type="text/css">
          </style>
          
          <code............>............</code>
          <style type="text/css"></style>
          
          <code............>............</code>
          <style type="text/css">
          code {
            font-family: &quot;verdana&quot;;
            font-size: 19px;
            color: black;
            font-weight: bold !important;
            line-height: 1 !important;
            }
          }
          </style>
          

          As you can see, it select only the line <code....>....</code> when the following section <style .....</style>, possibly multi-lines, does not contain any string code { or code{ !

          Notes :

          • I do not use any Backtracking Control verb

          • In the section <code....</code>, it must not contain any string </style>

          • In the section <style ....</style>, it must not contain any string code { or code{


          If you prefer to look for the string <code only and not all the zone <code....>....</code>, use the following regex :

          (?s-i)<code(?=(?:(?!</style>).)+?</code>\R<style (?:(?!code ?{).)*?</style>)

          Best Regards,

          guy038

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

            @guy038 There is a lot of text between the <code and <style (or more appropriately, between the </code> and <style) and yes, I want to find just <code. I think you need to introduce a .*? somewhere in the middle of the Regex, to find what is between <code and code\x20\{\s*font-family. The \x20 is to match a single white space, the \ just before the { is to help escape it and help match the { and the \s* is to match more than one white space, even if they are on the next line or a couple of lines below, as long as everything is a white space.

            I actually have this block to match the above:-

            <code............>............</code>
            A lot of text here, spanning many lines
            <style type="text/css">
            code {
              font-family: &quot;verdana&quot;;
              font-size: 19px;
              color: black;
              font-weight: bold !important;
              line-height: 1 !important;
              }
            }
            </style>
            Some text/codes here
            <div id="google_translate_element"></div>
            <script type="text/javascript">
            Some javascript here
            </script>
            

            I also want your Regular expression - RegEx - to skip any <code between <div id="google_translate_element"></div>\s*<script type="text/javascript"> and </script> - there are many <script tags and so, it should skip what is between <div id="google_translate_element"></div>\s*<script type="text/javascript"> and </script> as well as any <code between </code> and <style

            This RegEx worked but maybe you can improve upon it: (?s)(<code.*?code\x20\{\s*font-family|<div id="google_translate_element"></div>\s*<script.*?</script>)(*SKIP)(*F)|<code

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

              Hi, @dr-ramaanand and all,

              Ah…, OK. So I changed my line of reasoning :

              Instead of looking for zones which do not contain the string code\x20?{, I’m looking for sections which do contain the string code\x20?{

              Then, using the well-known backtracking control verbs (*SKIP)(*F), I omit these cases and look for the string <code, in all the other cases !!

              Thus, the following regex should solve your problem :

              (?xs-i) <code (?:(?!</style>).)+? </code> (?:(?!</style>).)+? <style\x20 (?:(?!</style>).)*? code\x20?{ .+? </style> (*SKIP) (*F) | <code

              Test it against the sample text, below :

              <code............>............</code>
              <style type="text/css">
              code{
                font-family: &quot;verdana&quot;;
                font-size: 19px;
                color: black;
                font-weight: bold !important;
                line-height: 1 !important;
                }
              }
              </style>
              
              <code............>............</code>
              <style type="text/css">
              </style>
              
              <code............>............</code>
              bla blah
              bla blah
              bla blah
              <style type="text/css">
              code{
                font-family: &quot;verdana&quot;;
                font-size: 19px;
                color: black;
                font-weight: bold !important;
                line-height: 1 !important;
                }
              }
              </style>
              
              <code............>............</code>
              <style type="text/css">
              </style>
              
              <code............>............</code>
              bla
              blah
              bla
              blah
              bla
              blah
              <style type="text/css"></style>
              
              <code............>............</code>
              <style type="text/css">
              code {
                font-family: &quot;verdana&quot;;
                font-size: 19px;
                color: black;
                font-weight: bold !important;
                line-height: 1 !important;
                }
              }
              </style>
              bla
              blah
              <code............>............</code>
              A lot of text here, spanning many lines
              <style type="text/css">
              code {
                font-family: &quot;verdana&quot;;
                font-size: 19px;
                color: black;
                font-weight: bold !important;
                line-height: 1 !important;
                }
              }
              </style>
              Some text/codes here
              <div id="google_translate_element"></div>
              <script type="text/javascript">
              Some javascript here
              </script>
              
              <code............>............</code>
              A lot of text here, spanning many lines
              <style type="text/css">
              </style>
              Some text/codes here
              <div id="google_translate_element"></div>
              <script type="text/javascript">
              Some javascript here
              </script>
              

              BR

              guy038

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

                @guy038 Your RegEx doesn’t skip what is between <div id="google_translate_element"></div>\s*<script and </script> (the \s* is to match any number of white spaces in between, even if it is on the next line). Is there any mistake in this RegEx: (?s)(<code.*?code\x20\{\s*font-family|<div id="google_translate_element"></div>\s*<script.*?</script>)(*SKIP)(*F)|<code ? I think it works.

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

                  Hello, @dr-ramaanand and all,

                  Your requests are quite complex. So I imagined a completely different way to solve the different required conditions !

                  We’ll add one special character, right before any string <code, beginning a line, when the conditions are not respected

                  Thus, perform, successively, these two regex replacements :

                  SEARCH (?xs-i) ^ <code (?: (?! <code ). )+? code \x20? {

                  REPLACE \x{2588}$0

                  We’re searching, here, for the string code\x20?{ !

                  And

                  SEARCH (?xs-i) ^ <code (?: (?! <code ). )+? google_translate_element

                  REPLACE \x{2588}$0

                  We’re searching, here, for the string google_translate_element !


                  Now, it’s quite trivial : simply search for the regex (?-i)^<code which should be the allowed cases, ONLY !

                  If you test it against my previous sample text, you should get the following modified text :

                  █<code............>............</code>
                  <style type="text/css">
                  code{
                    font-family: &quot;verdana&quot;;
                    font-size: 19px;
                    color: black;
                    font-weight: bold !important;
                    line-height: 1 !important;
                    }
                  }
                  </style>
                  
                  <code............>............</code>
                  <style type="text/css">
                  </style>
                  
                  █<code............>............</code>
                  bla blah
                  bla blah
                  bla blah
                  <style type="text/css">
                  code{
                    font-family: &quot;verdana&quot;;
                    font-size: 19px;
                    color: black;
                    font-weight: bold !important;
                    line-height: 1 !important;
                    }
                  }
                  </style>
                  
                  <code............>............</code>
                  <style type="text/css">
                  </style>
                  
                  <code............>............</code>
                  bla
                  blah
                  bla
                  blah
                  bla
                  blah
                  <style type="text/css"></style>
                  
                  █<code............>............</code>
                  <style type="text/css">
                  code {
                    font-family: &quot;verdana&quot;;
                    font-size: 19px;
                    color: black;
                    font-weight: bold !important;
                    line-height: 1 !important;
                    }
                  }
                  </style>
                  bla
                  blah
                  █<code............>............</code>
                  A lot of text here, spanning many lines
                  <style type="text/css">
                  code {
                    font-family: &quot;verdana&quot;;
                    font-size: 19px;
                    color: black;
                    font-weight: bold !important;
                    line-height: 1 !important;
                    }
                  }
                  </style>
                  Some text/codes here
                  <div id="google_translate_element"></div>
                  <script type="text/javascript">
                  Some javascript here
                  </script>
                  
                  █<code............>............</code>
                  A lot of text here, spanning many lines
                  <style type="text/css">
                  </style>
                  Some text/codes here
                  <div id="google_translate_element"></div>
                  <script type="text/javascript">
                  Some javascript here
                  </script>
                  

                  After analyzing your text, simply run this replacement :

                  SEARCH \x{2588}

                  REPLACE Leave EMPTY

                  BR

                  guy038

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

                    @guy038 This RegEx worked for me: (?s)(<code.*?code\x20\{\s*font-family|<div id="google_translate_element"></div>\s*<script.*?</script>)(*SKIP)(*F)|<code - thanks for your time anyway

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

                      Hi, @dr-ramaanand and all,

                      I do not understand why you think that the following regex is OK !

                      (?s)(<code.*?code\x20\{\s*font-family|<div id="google_translate_element"></div>\s*<script.*?</script>)(*SKIP)(*F)|<code

                      Apparently, against the sample text, used before and pasted in a new tab :

                      <code............>............</code>
                      <style type="text/css">
                      code{
                        font-family: &quot;verdana&quot;;
                        font-size: 19px;
                        color: black;
                        font-weight: bold !important;
                        line-height: 1 !important;
                        }
                      }
                      </style>
                      
                      <code............>............</code>
                      <style type="text/css">
                      </style>
                      
                      <code............>............</code>
                      bla blah
                      bla blah
                      bla blah
                      <style type="text/css">
                      code{
                        font-family: &quot;verdana&quot;;
                        font-size: 19px;
                        color: black;
                        font-weight: bold !important;
                        line-height: 1 !important;
                        }
                      }
                      </style>
                      
                      <code............>............</code>
                      <style type="text/css">
                      </style>
                      
                      <code............>............</code>
                      bla
                      blah
                      bla
                      blah
                      bla
                      blah
                      <style type="text/css"></style>
                      
                      <code............>............</code>
                      <style type="text/css">
                      code {
                        font-family: &quot;verdana&quot;;
                        font-size: 19px;
                        color: black;
                        font-weight: bold !important;
                        line-height: 1 !important;
                        }
                      }
                      </style>
                      bla
                      blah
                      <code............>............</code>
                      A lot of text here, spanning many lines
                      <style type="text/css">
                      code {
                        font-family: &quot;verdana&quot;;
                        font-size: 19px;
                        color: black;
                        font-weight: bold !important;
                        line-height: 1 !important;
                        }
                      }
                      </style>
                      Some text/codes here
                      <div id="google_translate_element"></div>
                      <script type="text/javascript">
                      Some javascript here
                      </script>
                      
                      MATCH
                      ¯¯|¯¯
                        |
                        v
                      <code............>............</code>
                      A lot of text here, spanning many lines
                      <style type="text/css">
                      </style>
                      Some text/codes here
                      <div id="google_translate_element"></div>
                      <script type="text/javascript">
                      Some javascript here
                      </script>
                      

                      It just selects the last line beginning with <code !


                      However, in a previous post, you said :

                      it should skip what is between <div id="google_translate_element"></div>\s*<script type="text/javascript"> and </script> …

                      And, precisely, this last line beginning with <code, is, indeed, followed, further on, with the block :

                      (?s)<div id="google_translate_element"></div>\s*<script type="text/javascript">.+?</script>

                      Thus, it should not have been matched ?!


                      Anyway, if this regex above seems to work nicely for you, that’s the main thing !

                      Best Regards,

                      guy038

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

                        @guy038 Merci beaucoup!

                        1 Reply Last reply Reply Quote 0

                        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                        With your input, this post could be even better 💗

                        Register Login
                        • First post
                          Last post
                        The Community of users of the Notepad++ text editor.
                        Powered by NodeBB | Contributors