- qpscanner/cfcs/jre-utils.cfc
- v0.7.3.2
- 6 KB
- 193
1<!--- jre-utils v0.6 | (c) Peter Boughton | License: LGPL --->
2<!--- NOTE: This library is obsolete; use cfRegex instead: cfregex.net --->
3<cfcomponent output="false">
4
5
6 <cffunction name="init" output="false" access="public">
7 <cfargument name="DefaultFlags" type="String" default="MULTILINE"/>
8 <cfargument name="IgnoreInvalidFlags" type="Boolean" default="false"/>
9 <cfargument name="BackslashReferences" type="Boolean" default="false"/>
10
11 <cfset var CurrentFlag = ""/>
12
13 <cfset This.Flags = Struct
14 ( UNIX_LINES : 1
15 , CASE_INSENSITIVE : 2
16 , COMMENTS : 4
17 , MULTILINE : 8
18 , DOTALL : 32
19 , UNICODE_CASE : 64
20 , CANON_EQ : 128
21 )/>
22
23 <cfset This.DefaultFlags = This.parseFlags( Arguments.DefaultFlags , Arguments.IgnoreInvalidFlags )/>
24
25 <cfset This.BackslashReferences = Arguments.BackslashReferences/>
26
27 <!--- In CFMX we cannot define a "Replace" function directly. --->
28 <cfset This.replace = _replace/>
29 <cfset StructDelete(This,'_replace')/>
30
31 <cfreturn This/>
32 </cffunction>
33
34
35
36 <cffunction name="Struct" returntype="Struct" access="private"><cfreturn Arguments/></cffunction>
37
38
39
40
41 <cffunction name="parseFlags" returntype="Numeric" output="false" access="public">
42 <cfargument name="FlagList" type="String"/>
43 <cfargument name="IgnoreInvalidFlags" type="Boolean" default="false"/>
44 <cfset var CurrentFlag = ""/>
45 <cfset var ResultFlag = 0/>
46
47 <cfloop index="CurrentFlag" list="#Arguments.FlagList#">
48
49 <cfif isNumeric(CurrentFlag)>
50 <cfset ResultFlag = BitOr( ResultFlag , CurrentFlag )/>
51
52 <cfelseif StructKeyExists( This.Flags , CurrentFlag )>
53 <cfset ResultFlag = BitOr( ResultFlag , This.Flags[CurrentFlag] )/>
54
55 <cfelseif NOT Arguments.IgnoreInvalidFlags>
56 <cfthrow message="Invalid Flag!" detail="[#CurrentFlag#] is not supported."/>
57
58 </cfif>
59
60 </cfloop>
61
62 <cfreturn ResultFlag/>
63 </cffunction>
64
65
66
67 <cffunction name="matches" returntype="Boolean" output="false" access="public">
68 <cfargument name="Text" type="String"/>
69 <cfargument name="Regex" type="String"/>
70 <cfargument name="Flags" default="#This.DefaultFlags#"/>
71
72 <cfset var Pattern = createObject("java","java.util.regex.Pattern")
73 .compile( Arguments.Regex , parseFlags(Arguments.Flags) )/>
74 <cfset var Matcher = Pattern.Matcher(Arguments.Text)/>
75
76 <cfloop condition="Matcher.find()">
77 <cfreturn True/>
78 </cfloop>
79
80 <cfreturn False/>
81 </cffunction>
82
83
84
85 <cffunction name="get" returntype="Array" output="false" access="public">
86 <cfargument name="Text" type="String"/>
87 <cfargument name="Regex" type="String"/>
88 <cfargument name="Flags" default="#This.DefaultFlags#"/>
89
90 <cfset var Pattern = CreateObject("java","java.util.regex.Pattern")
91 .compile( Arguments.Regex , parseFlags(Arguments.Flags) )/>
92 <cfset var Matcher = Pattern.Matcher(Arguments.Text)/>
93 <cfset var Matches = ArrayNew(1)/>
94
95 <cfloop condition="Matcher.find()">
96 <cfset ArrayAppend(Matches,Matcher.Group())/>
97 </cfloop>
98
99 <cfreturn Matches/>
100 </cffunction>
101
102
103
104 <cffunction name="getNoCase" returntype="Array" output="false" access="public">
105 <cfargument name="Text" type="String"/>
106 <cfargument name="Regex" type="String"/>
107 <cfargument name="Flags" default="#This.DefaultFlags#"/>
108
109 <cfreturn This.get
110 ( Text : Arguments.Text
111 , Regex : Arguments.Regex
112 , Flags : BitOr( Arguments.Flags , This.Flags.CASE_INSENSITIVE )
113 )/>
114 </cffunction>
115
116
117
118
119 <cffunction name="_replace" returntype="String" output="false" access="public">
120 <cfargument name="Text" type="String"/>
121 <cfargument name="Regex" type="String"/>
122 <cfargument name="Replacement" type="Any" hint="String or UDF"/>
123 <cfargument name="Scope" type="String" default="ONE" hint="ONE,ALL"/>
124
125 <cfset var String = ""/>
126 <cfset var Pattern = ""/>
127 <cfset var Matcher = ""/>
128 <cfset var Results = ""/>
129 <cfset var Groups = ""/>
130 <cfset var GroupIndex = ""/>
131
132 <cfif isSimpleValue(Arguments.Replacement)>
133
134 <cfif This.BackslashReferences AND REfind('[\\$]',Arguments.Replacement)>
135 <cfset Arguments.Replacement = replace(Arguments.Replacement,'$',Chr(65536),'all')/>
136 <cfset Arguments.Replacement = REreplace(Arguments.Replacement,'\\(?=[0-9])','$','all')/>
137 <cfset Arguments.Replacement = replace(Arguments.Replacement,Chr(65536),'\$','all')/>
138 </cfif>
139
140 <cfset String = createObject("java","java.lang.String").init(Arguments.Text)/>
141 <cfif Arguments.Scope EQ "ALL">
142 <cfreturn String.replaceAll(Arguments.Regex,Arguments.Replacement)/>
143 <cfelse>
144 <cfreturn String.replaceFirst(Arguments.Regex,Arguments.Replacement)/>
145 </cfif>
146
147 <cfelse>
148
149 <cfset Pattern = createObject("java","java.util.regex.Pattern").compile(Arguments.Regex)/>
150 <cfset Matcher = Pattern.Matcher( Arguments.Text )/>
151 <cfset Results = createObject("java","java.lang.StringBuffer").init()/>
152
153 <cfloop condition="Matcher.find()">
154
155 <cfset Groups = ArrayNew(1)/>
156
157 <cfloop index="GroupIndex" from="1" to="#Matcher.GroupCount()#">
158 <cfset ArrayAppend( Groups , Matcher.Group( JavaCast("int",GroupIndex) ) )/>
159 </cfloop>
160
161 <cfset Matcher.appendReplacement
162 ( Results , Arguments.Replacement( Matcher.Group() , Groups ) )/>
163
164 <cfif Arguments.Scope NEQ "ALL">
165 <cfbreak/>
166 </cfif>
167
168 </cfloop>
169
170 <cfset Matcher.appendTail(Results)/>
171
172 <cfreturn Results.toString()/>
173 </cfif>
174 </cffunction>
175
176
177
178 <cffunction name="escape" returntype="String" output="false" access="public">
179 <cfargument name="Text" type="String"/>
180 <cfset var Result = Arguments.Text/>
181 <cfset var Symbol = ""/>
182 <cfset var EscapeChars = "\,.,[,],(,),^,$,|,?,*,+,{,}"/>
183
184 <cfloop index="Symbol" list="#EscapeChars#">
185 <cfset Result = replace( Result , Symbol , '\'&Symbol , 'all')/>
186 </cfloop>
187
188 <cfreturn Result />
189 </cffunction>
190
191
192
193
194</cfcomponent>