#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "(?mx)^" & @CRLF & _
"(?P<group>" & @CRLF & _
" (?P<structured>" & @CRLF & _
" (?P<single>" & @CRLF & _
" (?P<tag_first>" & @CRLF & _
" (?P<tag>" & @CRLF & _
" \d+(?:\/\d+)+" & @CRLF & _
" |" & @CRLF & _
" (?P<repnum>\$+(?:@\^*-?\d*)?)" & @CRLF & _
" |" & @CRLF & _
" [\w:!-]" & @CRLF & _
" )++" & @CRLF & _
" (?P<attr>" & @CRLF & _
" (?P<short_attr>" & @CRLF & _
" \." & @CRLF & _
" (?P<short_val>" & @CRLF & _
" (?P>repnum)" & @CRLF & _
" |" & @CRLF & _
" [\w:!-]" & @CRLF & _
" )*" & @CRLF & _
" |" & @CRLF & _
" \#(?P>short_val)*" & @CRLF & _
" )" & @CRLF & _
" |" & @CRLF & _
" (?P<long_attr>" & @CRLF & _
" \[" & @CRLF & _
" (?P<attr_pair>" & @CRLF & _
" (?P<attr_name>" & @CRLF & _
" \\(?:\\{2})*["'\s]" & @CRLF & _
" |" & @CRLF & _
" [^\[\]"'\s\\]" & @CRLF & _
" )+" & @CRLF & _
" \.?" & @CRLF & _
" (?P<equal_val>" & @CRLF & _
" =" & @CRLF & _
" (?P<attr_val>" & @CRLF & _
" (?P<unquoted_val>" & @CRLF & _
" \\(?:\\{2})*[\[\]"'\s]" & @CRLF & _
" |" & @CRLF & _
" [^\[\]"'\s\\]" & @CRLF & _
" )+" & @CRLF & _
" |" & @CRLF & _
" (?P<quoted_val>" & @CRLF & _
" (?P<quote>["'])" & @CRLF & _
" (?:" & @CRLF & _
" (?P<escaped_all>\\(?:\\{2})*.)" & @CRLF & _
" |" & @CRLF & _
" [^"'\n\\]" & @CRLF & _
" )*" & @CRLF & _
" (?P=quote)" & @CRLF & _
" )" & @CRLF & _
" )?" & @CRLF & _
" )?" & @CRLF & _
" )?" & @CRLF & _
" (?:\s+(?P>attr_pair))*" & @CRLF & _
" \]" & @CRLF & _
" )" & @CRLF & _
" )*" & @CRLF & _
" |" & @CRLF & _
" (?P>attr)+" & @CRLF & _
" )" & @CRLF & _
" (?P<tag_rest>" & @CRLF & _
" (?P<text>" & @CRLF & _
" \{" & @CRLF & _
" (?P<text_content>" & @CRLF & _
" (?P>escaped_all)" & @CRLF & _
" |" & @CRLF & _
" [^{}\n\\]" & @CRLF & _
" )*" & @CRLF & _
" \}" & @CRLF & _
" )" & @CRLF & _
" (?P>attr)*" & @CRLF & _
" (?:" & @CRLF & _
" (?P<rep>\*\d*+)?" & @CRLF & _
" (?P>attr)*" & @CRLF & _
" (?P<close>\/)?" & @CRLF & _
" |" & @CRLF & _
" (?P>close)?" & @CRLF & _
" (?P>rep)?" & @CRLF & _
" )" & @CRLF & _
" |" & @CRLF & _
" (?P>rep)" & @CRLF & _
" (?P>attr)*" & @CRLF & _
" (?P>text)?" & @CRLF & _
" (?P>attr)*" & @CRLF & _
" (?P>close)?" & @CRLF & _
" |" & @CRLF & _
" (?P>close)" & @CRLF & _
" (?P>rep)?" & @CRLF & _
" )?" & @CRLF & _
" |" & @CRLF & _
" (?P<text_first>(?P>text)(?P>attr)*)" & @CRLF & _
" (?P<text_rest>" & @CRLF & _
" (?P>rep)" & @CRLF & _
" (?P>attr)*" & @CRLF & _
" (?P>close)?" & @CRLF & _
" |" & @CRLF & _
" (?P>close)" & @CRLF & _
" (?P>rep)?" & @CRLF & _
" )?" & @CRLF & _
" )" & @CRLF & _
" (?:" & @CRLF & _
" (?P<relation>[>+]|\^+)" & @CRLF & _
" (?P>group)*" & @CRLF & _
" )?" & @CRLF & _
" )" & @CRLF & _
"|" & @CRLF & _
" \(" & @CRLF & _
" (?P>group)*" & @CRLF & _
" \)" & @CRLF & _
" (?P>rep)?" & @CRLF & _
" (?P>relation)?" & @CRLF & _
")+" & @CRLF & _
"$"
Local $sString = ">>> tag <<<" & @CRLF & _
"tag" & @CRLF & _
"$" & @CRLF & _
"tag$with$@^^^-2repnum" & @CRLF & _
"1" & @CRLF & _
"1/2" & @CRLF & _
"1/2/3" & @CRLF & _
"tag1/2with1/2/3fraction" & @CRLF & _
"tag$@with1/2both" & @CRLF & _
"ri:a" & @CRLF & _
"!" & @CRLF & _
"!!!" & @CRLF & _
"-" & @CRLF & _
":" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"@" & @CRLF & _
"&" & @CRLF & _
"" & @CRLF & _
">>> short attr <<<" & @CRLF & _
"#" & @CRLF & _
"###" & @CRLF & _
"#id" & @CRLF & _
"#id1#id2" & @CRLF & _
"#id$@^^^-2" & @CRLF & _
"." & @CRLF & _
".#" & @CRLF & _
"..." & @CRLF & _
".class" & @CRLF & _
".class1.class2" & @CRLF & _
".class#id.class" & @CRLF & _
".class$@^-2type" & @CRLF & _
".class-data" & @CRLF & _
".!class" & @CRLF & _
".class:subclass" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
".@" & @CRLF & _
".汉字" & @CRLF & _
"" & @CRLF & _
">>> long attr <<<" & @CRLF & _
"[]" & @CRLF & _
"[key]" & @CRLF & _
"[key.]" & @CRLF & _
"[key...]" & @CRLF & _
"[key=]" & @CRLF & _
"[key.=]" & @CRLF & _
"[key=val]" & @CRLF & _
"[key.=val]" & @CRLF & _
"[key='val']" & @CRLF & _
"[key='val with space']" & @CRLF & _
"[key='val\\\'ue']" & @CRLF & _
"[key1=val1 key2=val2]" & @CRLF & _
"[][]" & @CRLF & _
"[key][key]" & @CRLF & _
".class[key]" & @CRLF & _
"[key].class" & @CRLF & _
"[汉字=汉字]" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"[\[]" & @CRLF & _
"[key='val\\'ue']" & @CRLF & _
"" & @CRLF & _
">>> text <<<" & @CRLF & _
"{}" & @CRLF & _
"{text}" & @CRLF & _
"{text with space}" & @CRLF & _
"{text with escaped \{ and \}}" & @CRLF & _
"{汉字}" & @CRLF & _
"tag{text}" & @CRLF & _
".attr{text}" & @CRLF & _
"{text}.attr" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"{\\{}" & @CRLF & _
"{{}}" & @CRLF & _
"" & @CRLF & _
">>> repeater <<<" & @CRLF & _
"tag*2" & @CRLF & _
".attr*2" & @CRLF & _
"{text}*2" & @CRLF & _
".attr{text}*2" & @CRLF & _
".attr{text}.attr*2" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"*2" & @CRLF & _
"tag*2*2" & @CRLF & _
"" & @CRLF & _
">>> self-close <<<" & @CRLF & _
"tag/" & @CRLF & _
".attr/" & @CRLF & _
"{text}/" & @CRLF & _
"tag*2/" & @CRLF & _
"tag/*2" & @CRLF & _
".attr{text}.attr/" & @CRLF & _
".attr*2.attr{text}.attr/" & @CRLF & _
".attr{text}.attr*2.attr/" & @CRLF & _
".attr{text}/*2" & @CRLF & _
"tag*2{text}/" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"/*2" & @CRLF & _
"tag//" & @CRLF & _
"" & @CRLF & _
">>> child <<<" & @CRLF & _
"tag>tag" & @CRLF & _
"tag.class*2>tag[key]/" & @CRLF & _
"tag>" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
">tag" & @CRLF & _
"tag>>" & @CRLF & _
"" & @CRLF & _
">>> sibling <<<" & @CRLF & _
"tag+tag" & @CRLF & _
".class/>[key]+.attr/*2" & @CRLF & _
"tag[key]tag" & @CRLF & _
"tag{text}tag" & @CRLF & _
"tag*2tag" & @CRLF & _
"tag/tag" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"+tag" & @CRLF & _
"tag++" & @CRLF & _
"" & @CRLF & _
">>> parent <<<" & @CRLF & _
"tag^tag" & @CRLF & _
"tag^^^" & @CRLF & _
"tag>tag+tag^tag" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"^tag" & @CRLF & _
"" & @CRLF & _
">>> group <<<" & @CRLF & _
"()" & @CRLF & _
"(())" & @CRLF & _
"(tag)" & @CRLF & _
"(tag)(tag)" & @CRLF & _
"((tag)(tag))" & @CRLF & _
"tag>(tag.class)" & @CRLF & _
"tag>(tag>tag+tag)" & @CRLF & _
"(tag>(tag+tag)*2)*2" & @CRLF & _
"(tag)tag" & @CRLF & _
"(tag>).class" & @CRLF & _
"(tag)*2^tag" & @CRLF & _
"(tag*2)^tag" & @CRLF & _
"(tag>)^tag" & @CRLF & _
"(tag)^" & @CRLF & _
"" & @CRLF & _
"===XXX===" & @CRLF & _
"(" & @CRLF & _
"(()"
Local $aArray = StringRegExp($sString, $sRegex, $STR_REGEXPARRAYGLOBALFULLMATCH)
Local $aFullArray[0]
For $i = 0 To UBound($aArray) -1
_ArrayConcatenate($aFullArray, $aArray[$i])
Next
$aArray = $aFullArray
; Present the entire match result
_ArrayDisplay($aArray, "Result")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for AutoIt, please visit: https://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm