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 ?
-
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: "verdana"; font-size: 19px; color: black; font-weight: bold !important; line-height: 1 !important; } } </style> -
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>”) -
(?s)<code.*?code\x20\{\s*font-family(*SKIP)(*F)|<codeworks 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 -
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
-
D dr ramaanand referenced this topic
-
An alternative Regular expression can be to introduce a negative lookahead between
.*?and thecodejust after it in this Regex:<code.*?code\x20\{\s*font-family -
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: "verdana"; 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: "verdana"; 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: "verdana"; 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 stringcode {orcode{!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 stringcode {orcode{
If you prefer to look for the string
<codeonly and not all the zone<code....>....</code>, use the following regex :(?s-i)<code(?=(?:(?!</style>).)+?</code>\R<style (?:(?!code ?{).)*?</style>)Best Regards,
guy038
-
-
@guy038 There is a lot of text between the
<codeand<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<codeandcode\x20\{\s*font-family. The\x20is 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: "verdana"; 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
<codebetween<div id="google_translate_element"></div>\s*<script type="text/javascript">and</script>- there are many<scripttags 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<codebetween</code>and<styleThis 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 -
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 stringcode\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) | <codeTest it against the sample text, below :
<code............>............</code> <style type="text/css"> code{ font-family: "verdana"; 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: "verdana"; 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: "verdana"; 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: "verdana"; 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
-
@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.
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