))+(?=)' ) , isQueryOfQuery = new cfregex( '(?si)dbtype\s*=\s*["'']query["'']' ) , killParams = new cfregex( '(?si)]++>' ) , killCfTag = new cfregex( '(?si)]*+>' ) , killOrderBy = new cfregex( '(?si)\bORDER BY\b.*?$' ) , killBuiltIn = new cfregex( '(?si)##(#ListChangeDelims(This.BuiltInFunctions,'|')#)\([^)]*\)##' ) , findScopes = new cfregex( '(?si)(?<=##([a-z]{1,20}\()?)[^\(##<]+?(?=\.[^##<]+?##)' ) , findQueryName = new cfregex( '(?<=\bname\s{0,99}=\s{0,99})(?:"[^"]++"|''[^'']++''|[^"''\s]++)' ) , Newline = new cfregex( chr(10) ) }/> (?x) ## Segment names must be preceeded by newline or paren. ## This helps avoid strings/variables causing confusion. (?<= (?:^|[()\n]) \s{0,99} ) #SegKeywords#[\s(] ## This part needs to lazily consume content until it finds ## the next segment, whilst also making sure it's not ## dealing with a [bracketed] column name. ## ## For performance, splitting out whitespace and parens ## allows the negative charset to match possessively ## without breaking the overall laziness. (?: [^\[\s()]++ | [\s()]+ | \[(?!\s*#SegKeywords#\s*\]) )+? ## A segment must be ended by either end of string or ## another segment. (?= $ | (?<=[)\s])#SegKeywords#[\s(] ) ' ) /> ' ) />