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 · · · – – – · · ·
    12 Posts 2 Posters 470 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 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 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

                        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