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<styleand 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.
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