<cffunction
name="REMatchGroups"
access="public"
returntype="array"
output="false"
hint="Returns the captrued groups for each pattern match.">
<cfargument
name="Text"
type="string"
required="true"
hint="The target text in which we are trying to match patterns."
/>
<cfargument
name="Pattern"
type="string"
required="true"
hint="The regular expression patterns that we are matching."
/>
<cfargument
name="Scope"
type="string"
required="false"
default="ALL"
hint="The scope of pattern matching (valid is ONE or ALL)."
/>
<cfset var LOCAL = StructNew() />
<cfset LOCAL.Results = ArrayNew( 1 ) />
<cfset LOCAL.Pattern = CreateObject(
"java",
"java.util.regex.Pattern"
).Compile(
JavaCast( "string", ARGUMENTS.Pattern )
)
/>
<cfset LOCAL.Matcher = LOCAL.Pattern.Matcher(
JavaCast( "string", ARGUMENTS.Text )
) />
<cfloop condition="LOCAL.Matcher.Find()">
<cfset LOCAL.Groups = StructNew() />
<cfloop
index="LOCAL.GroupIndex"
from="0"
to="#LOCAL.Matcher.GroupCount()#"
step="1">
<cfset LOCAL.Groups[ LOCAL.GroupIndex ] = LOCAL.Matcher.Group(
JavaCast( "int", LOCAL.GroupIndex )
) />
</cfloop>
<cfset ArrayAppend( LOCAL.Results, LOCAL.Groups ) />
<cfif (ARGUMENTS.Scope EQ "ONE")>
<cfbreak />
</cfif>
</cfloop>
<cfreturn LOCAL.Results />
</cffunction>