#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "(?u)#\{(?![.\d])(?=(?<inner>(?:[\-_]{0,4}(?<![\-_]{5})[\p{L}\d]{2,}[\.\-_]?[\-_]{0,3})+))\1(?<!\.)\}"
Local $sString = "- Must start with `#{`, not captured. " & @CRLF & _
"- Must end with `}`, not captured." & @CRLF & _
"- Named capture group 'inner' within the brackets." & @CRLF & _
"- Must only contain periods, dashes, underscores, unicode letters, and 0-9 digits." & @CRLF & _
"- Must contain at least two unicode letters, or at least one unicode letter and digit." & @CRLF & _
"- Cannot begin or end with a period. Ex.`#{.foo.}`not matched." & @CRLF & _
"- Cannot start with a digit. Ex. `#{42_digitAtStart}` is not matched." & @CRLF & _
"- No periods before unicode chars, Ex. `#{_.foo}` is not matched." & @CRLF & _
"- Two periods cannot be next to one another. Ex. `#{foo.bar}` is OK, but `#{foo..bar}`, `#{.foo}`, and `#{foo.}` are not." & @CRLF & _
"- cannot contain any mix of more than 4 dashes or underscores next to one another. Eg. `#{foo____}` and `#{-_-_foo-bar_-_-}` are OK, but `#{--___ foo}` and `#{bar-_-_--} are not." & @CRLF & _
"" & @CRLF & _
"MUST MATCH" & @CRLF & _
"#{alpha} #{beta} #{charlie}" & @CRLF & _
"#{ìñtérnâtiônàlizàtïon}" & @CRLF & _
"#{مرحبا} #{こんにちは} #{мир}" & @CRLF & _
"#{-dashes-}" & @CRLF & _
"#{_under_scores_}" & @CRLF & _
"#{dots.and-dashes-and_under_scores}" & @CRLF & _
"#{some_ASCII_Digits_12345}" & @CRLF & _
"#{a2ndPositionDigit}" & @CRLF & _
"#{test.foo.bar.baz}" & @CRLF & _
"#{outer_must_not_match#{#{only_deepest_must_match}}}" & @CRLF & _
"#{____fourUnderscoresAndDashesTogether}" & @CRLF & _
"#{fourDashes-_--}" & @CRLF & _
"#{a2} // One letter and one digit" & @CRLF & _
"#{period._} // Note period BEFORE letters is not allowed" & @CRLF & _
"" & @CRLF & _
"MUST NOT MATCH" & @CRLF & _
"#{} // Empty" & @CRLF & _
"#{a} #{-} #{_} // Single characters" & @CRLF & _
"#{42_digitAtStart}" & @CRLF & _
"#{0123456789} // Only digits" & @CRLF & _
"#{.periodAtStart}" & @CRLF & _
"#{periodAtEnd.}" & @CRLF & _
"#{moreThanOnePeriod..Together}" & @CRLF & _
"#{a.singleStartingCharacterFollowedByPeriod}" & @CRLF & _
"#{#non-Dash_Underscore_Period.Symbols}" & @CRLF & _
"#{---} // Only Dashes" & @CRLF & _
"#{-_-} // Only dashes and underscores" & @CRLF & _
"#{_-_}" & @CRLF & _
"#{-_-_-moreThanFourModifiers}" & @CRLF & _
"#{_.dotBeforeCharacters}" & @CRLF & _
"#{-_-_-moreThanFourModifiers}" & @CRLF & _
"#{modifiers-----five}" & @CRLF & _
"#{modifiers______six}" & @CRLF & _
"#{modifiers-------seven}" & @CRLF & _
"#{modifiers_-_-_-_-eight}" & @CRLF & _
"#{moreThanFourModifiers-_-_-}" & @CRLF & _
"#{last\} // escape backslashes" & @CRLF & _
"#{\first}" & @CRLF & _
"#{mid\dle}"
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