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

                  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