1 11 package org.eclipse.debug.internal.ui; 12 13 14 import java.util.*; 15 16 19 public class StringMatcher { 20 protected String fPattern; 21 protected int fLength; protected boolean fIgnoreWildCards; 23 protected boolean fIgnoreCase; 24 protected boolean fHasLeadingStar; 25 protected boolean fHasTrailingStar; 26 protected String fSegments[]; 28 29 protected int fBound= 0; 30 31 32 protected static final char fSingleWildCard= '\u0000'; 33 34 public static class Position { 35 int start; int end; public Position(int start, int end) { 38 this.start= start; 39 this.end= end; 40 } 41 public int getStart() { 42 return start; 43 } 44 public int getEnd() { 45 return end; 46 } 47 } 48 68 public StringMatcher(String pattern, boolean ignoreCase, boolean ignoreWildCards) { 69 if (pattern == null) 70 throw new IllegalArgumentException (); 71 fIgnoreCase= ignoreCase; 72 fIgnoreWildCards= ignoreWildCards; 73 fPattern= pattern; 74 fLength= pattern.length(); 75 76 if (fIgnoreWildCards) { 77 parseNoWildCards(); 78 } else { 79 parseWildCards(); 80 } 81 } 82 95 public StringMatcher.Position find(String text, int start, int end) { 96 if (text == null) 97 throw new IllegalArgumentException (); 98 99 int tlen= text.length(); 100 if (start < 0) 101 start= 0; 102 if (end > tlen) 103 end= tlen; 104 if (end < 0 ||start >= end ) 105 return null; 106 if (fLength == 0) 107 return new Position(start, start); 108 if (fIgnoreWildCards) { 109 int x= posIn(text, start, end); 110 if (x < 0) 111 return null; 112 return new Position(x, x+fLength); 113 } 114 115 int segCount= fSegments.length; 116 if (segCount == 0) return new Position (start, end); 118 119 int curPos= start; 120 int matchStart= -1; 121 int i; 122 for (i= 0; i < segCount && curPos < end; ++i) { 123 String current= fSegments[i]; 124 int nextMatch= regExpPosIn(text, curPos, end, current); 125 if (nextMatch < 0 ) 126 return null; 127 if(i == 0) 128 matchStart= nextMatch; 129 curPos= nextMatch + current.length(); 130 } 131 if (i < segCount) 132 return null; 133 return new Position(matchStart, curPos); 134 } 135 140 public boolean match(String text) { 141 return match(text, 0, text.length()); 142 } 143 151 public boolean match(String text, int start, int end) { 152 if (null == text) 153 throw new IllegalArgumentException (); 154 155 if (start > end) 156 return false; 157 158 if (fIgnoreWildCards) 159 return (end - start == fLength) && fPattern.regionMatches(fIgnoreCase, 0, text, start, fLength); 160 int segCount= fSegments.length; 161 if (segCount == 0 && (fHasLeadingStar || fHasTrailingStar)) return true; 163 if (start == end) 164 return fLength == 0; 165 if (fLength == 0) 166 return start == end; 167 168 int tlen= text.length(); 169 if (start < 0) 170 start= 0; 171 if (end > tlen) 172 end= tlen; 173 174 int tCurPos= start; 175 int bound= end - fBound; 176 if ( bound < 0) 177 return false; 178 int i=0; 179 String current= fSegments[i]; 180 int segLength= current.length(); 181 182 183 if (!fHasLeadingStar){ 184 if(!regExpRegionMatches(text, start, current, 0, segLength)) { 185 return false; 186 } else { 187 ++i; 188 tCurPos= tCurPos + segLength; 189 } 190 } 191 if ((fSegments.length == 1) && (!fHasLeadingStar) && (!fHasTrailingStar)) { 192 return tCurPos == end; 194 } 195 196 while (i < segCount) { 197 current= fSegments[i]; 198 int currentMatch; 199 int k= current.indexOf(fSingleWildCard); 200 if (k < 0) { 201 currentMatch= textPosIn(text, tCurPos, end, current); 202 if (currentMatch < 0) 203 return false; 204 } else { 205 currentMatch= regExpPosIn(text, tCurPos, end, current); 206 if (currentMatch < 0) 207 return false; 208 } 209 tCurPos= currentMatch + current.length(); 210 i++; 211 } 212 213 214 if (!fHasTrailingStar && tCurPos != end) { 215 int clen= current.length(); 216 return regExpRegionMatches(text, end - clen, current, 0, clen); 217 } 218 return i == segCount ; 219 } 220 221 225 private void parseNoWildCards() { 226 fSegments= new String [1]; 227 fSegments[0]= fPattern; 228 fBound= fLength; 229 } 230 234 private void parseWildCards() { 235 if(fPattern.startsWith("*")) fHasLeadingStar= true; 237 if(fPattern.endsWith("*")) { 239 if (fLength > 1 && fPattern.charAt(fLength - 2) != '\\') { 240 fHasTrailingStar= true; 241 } 242 } 243 244 Vector temp= new Vector(); 245 246 int pos= 0; 247 StringBuffer buf= new StringBuffer (); 248 while (pos < fLength) { 249 char c= fPattern.charAt(pos++); 250 switch (c) { 251 case '\\': 252 if (pos >= fLength) { 253 buf.append(c); 254 } else { 255 char next= fPattern.charAt(pos++); 256 257 if (next == '*' || next == '?' || next == '\\') { 258 buf.append(next); 259 } else { 260 261 buf.append(c); 262 buf.append(next); 263 } 264 } 265 break; 266 case '*': 267 if (buf.length() > 0) { 268 269 temp.addElement(buf.toString()); 270 fBound += buf.length(); 271 buf.setLength(0); 272 } 273 break; 274 case '?': 275 276 buf.append(fSingleWildCard); 277 break; 278 default: 279 buf.append(c); 280 } 281 } 282 283 284 if (buf.length() > 0) { 285 temp.addElement(buf.toString()); 286 fBound += buf.length(); 287 } 288 289 fSegments= new String [temp.size()]; 290 temp.copyInto(fSegments); 291 } 292 298 protected int posIn(String text, int start, int end) { int max= end - fLength; 300 301 if (!fIgnoreCase) { 302 int i= text.indexOf(fPattern, start); 303 if (i == -1 || i > max) 304 return -1; 305 return i; 306 } 307 308 for (int i= start; i <= max; ++i) { 309 if (text.regionMatches(true, i, fPattern, 0, fLength)) 310 return i; 311 } 312 313 return -1; 314 } 315 323 protected int regExpPosIn(String text, int start, int end, String p) { 324 int plen= p.length(); 325 326 int max= end - plen; 327 for (int i= start; i <= max; ++i) { 328 if (regExpRegionMatches(text, i, p, 0, plen)) 329 return i; 330 } 331 return -1; 332 } 333 342 protected boolean regExpRegionMatches(String text, int tStart, String p, int pStart, int plen) { 343 while (plen-- > 0) { 344 char tchar= text.charAt(tStart++); 345 char pchar= p.charAt(pStart++); 346 347 348 if (!fIgnoreWildCards) { 349 350 if (pchar == fSingleWildCard) { 351 continue; 352 } 353 } 354 if (pchar == tchar) 355 continue; 356 if (fIgnoreCase) { 357 if (Character.toUpperCase(tchar) == Character.toUpperCase(pchar)) 358 continue; 359 if (Character.toLowerCase(tchar) == Character.toLowerCase(pchar)) 362 continue; 363 } 364 return false; 365 } 366 return true; 367 } 368 376 protected int textPosIn(String text, int start, int end, String p) { 377 378 int plen= p.length(); 379 int max= end - plen; 380 381 if (!fIgnoreCase) { 382 int i= text.indexOf(p, start); 383 if (i == -1 || i > max) 384 return -1; 385 return i; 386 } 387 388 for (int i= start; i <= max; ++i) { 389 if (text.regionMatches(true, i, p, 0, plen)) 390 return i; 391 } 392 393 return -1; 394 } 395 } 396 | Popular Tags |