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 · · · – – – · · ·
    9 Posts 2 Posters 256 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 Online
      dr ramaanand
      last edited by

      So, the “code” in this should be found:

      <code............>............</code>
      <style type="text/css">
      </style>
      

      …but not in this:-

      <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>
      
      dr ramaanandD 1 Reply Last reply Reply Quote 0
      • dr ramaanandD Online
        dr ramaanand @dr ramaanand
        last edited by dr ramaanand

        I tried this Regular expression but it did not help: <code(?!(?:(?!<\/style>)(?s:.) )*<style>) - it matches both (I want it to skip finding the <code...... in example 2 since there is a “code” between “<style” and “</style>”)

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

          (?s)<code.*?code\x20\{\s*font-family(*SKIP)(*F)|<code works but I would like an expert to confirm if it is the best method
          @peterjones @alan-kilborn @guy038 or anyone else willing to help, if you have any alternative method also, I am willing to use it, since some of you dislike the (*SKIP)(*F) method

          dr ramaanandD 1 Reply Last reply Reply Quote 0
          • dr ramaanandD Online
            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 Online
              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 Online
                  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 Online
                      dr ramaanand @guy038
                      last edited by

                      @guy038 Yes that is perfect. Merci beaucoup. 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 does the same thing as your Regular expression.

                      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