Regular Expressions 101

Save & Share

  • Save Regex
    ctrl+s
  • Update Regex
    ctrl+⇧+s

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8

Function

  • Match
  • Substitution
  • List
  • Unit Tests
/
(?(DEFINE) #Это блок с объявлением функций #Этот блок - единственное место, где нужно подставлять значения (?<tagName>ul) #Имя тега (?<attrName>class) #Атрибут тега (?<attrValue>ul) #Значение тега (?<anyAttrName>[^\s\>\=]*+) #Любое название атрибута (?<anyAttrValue>\"[^\"]*+\"|\'[^\']*+\'|\`[^\']*+\`|[^\s\>]*+) #Любое значение атрибута (?<anyAttr>(?&anyAttrName)\s*+(?:\=\s*+(?&anyAttrValue)\s*+)?+) #Любой атрибут #Если нужно найти точное вхождение значения атрибута (?<attr> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск точного вхождения \"(?&attrValue)\"| \'(?&attrValue)\'| \`(?&attrValue)\`| (?&attrValue)(?=[\s\>]) ) ) #Если нужно искать в атрибуте значение как в классах (?<attrClass> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск значения как в классах \"[^\"]*?\b(?&attrValue)\b[^\"]*+\"| \'[^\']*?\b(?&attrValue)\b[^\']*+\'| \`[^\`]*?\b(?&attrValue)\b[^\`]*+\`| (?&attrValue)(?=[\s\>]) ) ) зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута #Строгое сравнение значения (?<tag>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attr)(?&anyAttr)*?\>) #Использовать так: (?&tag) #Поиск значения как в классах (?<tagClass>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attrClass)(?&anyAttr)*?\>) #Использовать так: (?&tagClass) ) #Этот огровный блок с функциями закончился (?:[^\<]++(*SKIP)|\G|\C*?(?<parentTag>(?&tagClass)))[^\<]*+\K #После того, как нашли тег сбросили состояние нулевой группы (?<openTag>\<li\b\s*+(?&anyAttr)*+\>) тега могут быть атрибуты (?<innerHTML>\C*?) #Внутреннее содержимое тега (?<closeTag> \<\/li\b\s*+(?&anyAttr)*+>| HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается (?=(?&openTag))| #Теги элементов списка необязательно закрывать согласно документации (?=(?<closeParentTag>\<\/ul\b\s*+(?&anyAttr)*+\>)) #Закрытие списка закрывает последний элемент )
/
gxuJi
Subpattern definition construct
(?(DEFINE) #Это блок с объявлением функций #Этот блок - единственное место, где нужно подставлять значения (?<tagName>ul) #Имя тега (?<attrName>class) #Атрибут тега (?<attrValue>ul) #Значение тега (?<anyAttrName>[^\s\>\=]*+) #Любое название атрибута (?<anyAttrValue>\"[^\"]*+\"|\'[^\']*+\'|\`[^\']*+\`|[^\s\>]*+) #Любое значение атрибута (?<anyAttr>(?&anyAttrName)\s*+(?:\=\s*+(?&anyAttrValue)\s*+)?+) #Любой атрибут #Если нужно найти точное вхождение значения атрибута (?<attr> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск точного вхождения \"(?&attrValue)\"| \'(?&attrValue)\'| \`(?&attrValue)\`| (?&attrValue)(?=[\s\>]) ) ) #Если нужно искать в атрибуте значение как в классах (?<attrClass> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск значения как в классах \"[^\"]*?\b(?&attrValue)\b[^\"]*+\"| \'[^\']*?\b(?&attrValue)\b[^\']*+\'| \`[^\`]*?\b(?&attrValue)\b[^\`]*+\`| (?&attrValue)(?=[\s\>]) ) ) зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута #Строгое сравнение значения (?<tag>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attr)(?&anyAttr)*?\>) #Использовать так: (?&tag) #Поиск значения как в классах (?<tagClass>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attrClass)(?&anyAttr)*?\>) #Использовать так: (?&tagClass) )
May only be used to define functions. No matching is done in this group.
#Это блок с объявлением функций
Это блок с объявлением функций
Comment: Это блок с объявлением функций
#Этот блок - единственное место, где нужно подставлять значения
Этот блок - единственное место, где нужно подставлять значения
Comment: Этот блок - единственное место, где нужно подставлять значения
Named Capture Group tagName
(?<tagName>ul)
ul
matches the characters ul literally (case insensitive)
#Имя тега
Имя тега
Comment: Имя тега
Named Capture Group attrName
(?<attrName>class)
class
matches the characters class literally (case insensitive)
#Атрибут тега
Атрибут тега
Comment: Атрибут тега
Named Capture Group attrValue
(?<attrValue>ul)
ul
matches the characters ul literally (case insensitive)
#Значение тега
Значение тега
Comment: Значение тега
Named Capture Group anyAttrName
(?<anyAttrName>[^\s\>\=]*+)
Match a single character not present in the list below
[^\s\>\=]
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
\s matches any kind of invisible character (equivalent to [\p{Z}\h\v])
\> matches the character > with index 6210 (3E16 or 768) literally (case insensitive)
\= matches the character = with index 6110 (3D16 or 758) literally (case insensitive)
#Любое название атрибута
Любое название атрибута
Comment: Любое название атрибута
Named Capture Group anyAttrValue
(?<anyAttrValue>\"[^\"]*+\"|\'[^\']*+\'|\`[^\']*+\`|[^\s\>]*+)
1st Alternative
\"[^\"]*+\"
\" matches the character " with index 3410 (2216 or 428) literally (case insensitive)
Match a single character not present in the list below
[^\"]
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
\" matches the character " with index 3410 (2216 or 428) literally (case insensitive)
\" matches the character " with index 3410 (2216 or 428) literally (case insensitive)
2nd Alternative
\'[^\']*+\'
3rd Alternative
\`[^\']*+\`
4th Alternative
[^\s\>]*+
#Любое значение атрибута
Любое значение атрибута
Named Capture Group anyAttr
(?<anyAttr>(?&anyAttrName)\s*+(?:\=\s*+(?&anyAttrValue)\s*+)?+)
#Любой атрибут
Любой атрибут
#Если нужно найти точное вхождение значения атрибута
Если нужно найти точное вхождение значения атрибута
Named Capture Group attr
(?<attr> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск точного вхождения \"(?&attrValue)\"| \'(?&attrValue)\'| \`(?&attrValue)\`| (?&attrValue)(?=[\s\>]) ) )
#Если нужно искать в атрибуте значение как в классах
Если нужно искать в атрибуте значение как в классах
Named Capture Group attrClass
(?<attrClass> (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута (?: #Поиск значения как в классах \"[^\"]*?\b(?&attrValue)\b[^\"]*+\"| \'[^\']*?\b(?&attrValue)\b[^\']*+\'| \`[^\`]*?\b(?&attrValue)\b[^\`]*+\`| (?&attrValue)(?=[\s\>]) ) )
зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута
В зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута
#Строгое сравнение значения
Строгое сравнение значения
Named Capture Group tag
(?<tag>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attr)(?&anyAttr)*?\>)
#Использовать так: (?&tag)
Использовать так: (?&tag)
#Поиск значения как в классах
Поиск значения как в классах
Named Capture Group tagClass
(?<tagClass>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attrClass)(?&anyAttr)*?\>)
#Использовать так: (?&tagClass)
Использовать так: (?&tagClass)
#Этот огровный блок с функциями закончился
Этот огровный блок с функциями закончился
Comment: Этот огровный блок с функциями закончился
Non-capturing group
(?:[^\<]++(*SKIP)|\G|\C*?(?<parentTag>(?&tagClass)))
1st Alternative
[^\<]++(*SKIP)
Match a single character not present in the list below
[^\<]
++ matches the previous token between one and unlimited times, as many times as possible, without giving back (possessive)
\< matches the character < with index 6010 (3C16 or 748) literally (case insensitive)
(*SKIP) acts like (*PRUNE), except that if the pattern is unanchored, the bumpalong advance is not to the next character, but to the position in the subject where (*SKIP) was encountered
2nd Alternative
\G
\G asserts position at the end of the previous match or the start of the string for the first match
3rd Alternative
\C*?(?<parentTag>(?&tagClass))
\C
matches one data unit, even in UTF mode (best avoided)
*? matches the previous token between zero and unlimited times, as few times as possible, expanding as needed (lazy)
Named Capture Group parentTag
(?<parentTag>(?&tagClass))
(?&tagClass) recurses the subpattern named tagClass
Match a single character not present in the list below
[^\<]
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
\< matches the character < with index 6010 (3C16 or 748) literally (case insensitive)
\K resets the starting point of the reported match. Any previously consumed characters are no longer included in the final match
#После того, как нашли тег сбросили состояние нулевой группы
После того, как нашли тег сбросили состояние нулевой группы
Comment: После того, как нашли тег сбросили состояние нулевой группы
Named Capture Group openTag
(?<openTag>\<li\b\s*+(?&anyAttr)*+\>)
\< matches the character < with index 6010 (3C16 or 748) literally (case insensitive)
li
matches the characters li literally (case insensitive)
\b assert position at a word boundary: (^\w|\w$|\W\w|\w\W)
\s
matches any kind of invisible character (equivalent to [\p{Z}\h\v])
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
(?&anyAttr)
recurses the subpattern named anyAttr
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
\> matches the character > with index 6210 (3E16 or 768) literally (case insensitive)
тега могут быть атрибуты
У тега могут быть атрибуты
Comment: У тега могут быть атрибуты
Named Capture Group innerHTML
(?<innerHTML>\C*?)
\C
matches one data unit, even in UTF mode (best avoided)
*? matches the previous token between zero and unlimited times, as few times as possible, expanding as needed (lazy)
#Внутреннее содержимое тега
Внутреннее содержимое тега
Comment: Внутреннее содержимое тега
Named Capture Group closeTag
(?<closeTag> \<\/li\b\s*+(?&anyAttr)*+>| HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается (?=(?&openTag))| #Теги элементов списка необязательно закрывать согласно документации (?=(?<closeParentTag>\<\/ul\b\s*+(?&anyAttr)*+\>)) #Закрытие списка закрывает последний элемент )
1st Alternative
\<\/li\b\s*+(?&anyAttr)*+>
\< matches the character < with index 6010 (3C16 or 748) literally (case insensitive)
\/ matches the character / with index 4710 (2F16 or 578) literally (case insensitive)
li
matches the characters li literally (case insensitive)
\b assert position at a word boundary: (^\w|\w$|\W\w|\w\W)
\s
matches any kind of invisible character (equivalent to [\p{Z}\h\v])
*+ matches the previous token between zero and unlimited times, as many times as possible, without giving back (possessive)
(?&anyAttr)
recurses the subpattern named anyAttr
> matches the character > with index 6210 (3E16 or 768) literally (case insensitive)
2nd Alternative
HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается (?=(?&openTag))
HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается
В HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается
Comment: В HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается
Positive Lookahead
(?=(?&openTag))
Assert that the Regex below matches
3rd Alternative
#Теги элементов списка необязательно закрывать согласно документации (?=(?<closeParentTag>\<\/ul\b\s*+(?&anyAttr)*+\>)) #Закрытие списка закрывает последний элемент
Global pattern flags
g modifier: global. All matches (don't return after first match)
x modifier: extended. Spaces and text after a # in the pattern are ignored
u modifier: unicode. Pattern strings are treated as UTF-16. Also causes escape sequences to match unicode characters
J modifier: Allow duplicate subpattern names
i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z])
Your regular expression does not match the subject string.Try launching the debugger to find out why.

Regular Expression
No Match

/
/
gxuJi

Test String