#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "\(+\*+(?:(?:\(+\*+(?:(?:\(+\*+(?:[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+)|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+)|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+"
Local $sString = "The following regex handles any (* *) style string. Let's call it p{1}" & @CRLF & _
"" & @CRLF & _
" p{1} = \(+\*+(?:[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
"The targeted string can include the characters {*, (, )}, but not the character sequences "(*" or "*)" (on which the regex terminates)." & @CRLF & _
"" & @CRLF & _
"Examples:" & @CRLF & _
"" & @CRLF & _
" (* simple one *)" & @CRLF & _
" (* more * ) ( * () **( difficult * ))()*(( one *)" & @CRLF & _
" (* r *( e*a) () * * l ()* * ( ) ) l * ( ) ) * **( y bad *)" & @CRLF & _
"" & @CRLF & _
"Explanation:" & @CRLF & _
"" & @CRLF & _
" \(+\*+ # begin with a (* sequence (or some variation like ((* or ((**, etc.)" & @CRLF & _
" (?: # begin comment content" & @CRLF & _
" [^*(] # allow any non-* non-( characters (which begin open/close brackets)" & @CRLF & _
" | # also" & @CRLF & _
" (?:\*+[^)*]) # allow * 1+ times in a row ONLY if it's not immediately followed by ) or *" & @CRLF & _
" | # also" & @CRLF & _
" (?:\(+[^*(]) # allow ( 1+ times in a row ONLY if it's not immediately followed by * or (" & @CRLF & _
" )* # allow any number of these characters / character sequences" & @CRLF & _
" \*+\)+ # then close the comment with a *) (or some variation like **) or *))), etc.)" & @CRLF & _
"" & @CRLF & _
"To capture un-nested and nested comments, simply allow comments inside of comments. ie:" & @CRLF & _
"" & @CRLF & _
" p{2} = \(+\*+(?:(?:p{1})|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
"in other words" & @CRLF & _
"" & @CRLF & _
" p{2} = \(+\*+(?:(?:\(+\*+(?:[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+)|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
"You'll see that this works on the following examples:" & @CRLF & _
" (* test (* one *) *)" & @CRLF & _
" (* a bit * ( ) * harder (* ) * () (( *) *)" & @CRLF & _
" (* r *( (( e **( a ) ((* l *() l *) y * bad * ( *)" & @CRLF & _
"" & @CRLF & _
"To capture up to triply-nested comments, follow the pattern set by p{2}:" & @CRLF & _
"" & @CRLF & _
" p{3} = \(+\*+(?:(?:p{2})|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
" p{3} = \(+\*+(?:(?:\(+\*+(?:(?:\(+\*+(?:[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+)|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+)|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
"Examples:" & @CRLF & _
" (* an (* easy (* one *) *) *)" & @CRLF & _
" (* only (* some (* levels (* captured *) because *) 4x *) nested *)" & @CRLF & _
"" & @CRLF & _
"The pattern can be followed to allow any depth of nested comments to be captured, by defining" & @CRLF & _
"" & @CRLF & _
" p{N} = \(+\*+(?:(?:p{N-1})|[^*(]|(?:\*+[^)*])|(?:\(+[^*(]))*\*+\)+" & @CRLF & _
"" & @CRLF & _
"for N > 1" & @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