1 package org.apache.commons.digester3;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class SimpleRegexMatcher
41 extends RegexMatcher
42 {
43
44
45
46
47 private static final Log BASE_LOG = LogFactory.getLog( SimpleRegexMatcher.class );
48
49
50 private Log log = BASE_LOG;
51
52
53
54
55
56
57
58
59 public Log getLog()
60 {
61 return log;
62 }
63
64
65
66
67
68
69 public void setLog( Log log )
70 {
71 this.log = log;
72 }
73
74
75
76
77
78
79 @Override
80 public boolean match( String basePattern, String regexPattern )
81 {
82
83 if ( basePattern == null || regexPattern == null )
84 {
85 return false;
86 }
87 return match( basePattern, regexPattern, 0, 0 );
88 }
89
90
91
92
93
94
95
96
97
98
99
100 private boolean match( String basePattern, String regexPattern, int baseAt, int regexAt )
101 {
102 if ( log.isTraceEnabled() )
103 {
104 log.trace( "Base: " + basePattern );
105 log.trace( "Regex: " + regexPattern );
106 log.trace( "Base@" + baseAt );
107 log.trace( "Regex@" + regexAt );
108 }
109
110
111 if ( regexAt >= regexPattern.length() )
112 {
113
114 if ( baseAt >= basePattern.length() )
115 {
116
117 return true;
118 }
119
120 return false;
121
122 }
123 if ( baseAt >= basePattern.length() )
124 {
125
126 return false;
127 }
128
129
130 char regexCurrent = regexPattern.charAt( regexAt );
131 switch ( regexCurrent )
132 {
133 case '*':
134
135
136 if ( ++regexAt >= regexPattern.length() )
137 {
138
139 return true;
140 }
141
142
143 char nextRegex = regexPattern.charAt( regexAt );
144 if ( log.isTraceEnabled() )
145 {
146 log.trace( "Searching for next '" + nextRegex + "' char" );
147 }
148 int nextMatch = basePattern.indexOf( nextRegex, baseAt );
149 while ( nextMatch != -1 )
150 {
151 if ( log.isTraceEnabled() )
152 {
153 log.trace( "Trying '*' match@" + nextMatch );
154 }
155 if ( match( basePattern, regexPattern, nextMatch, regexAt ) )
156 {
157 return true;
158 }
159 nextMatch = basePattern.indexOf( nextRegex, nextMatch + 1 );
160 }
161 log.trace( "No matches found." );
162 return false;
163
164 case '?':
165
166 return match( basePattern, regexPattern, ++baseAt, ++regexAt );
167
168 default:
169 if ( log.isTraceEnabled() )
170 {
171 log.trace( "Camparing " + regexCurrent + " to " + basePattern.charAt( baseAt ) );
172 }
173 if ( regexCurrent == basePattern.charAt( baseAt ) )
174 {
175
176 return match( basePattern, regexPattern, ++baseAt, ++regexAt );
177 }
178 return false;
179 }
180 }
181
182 }