01: /*
02: * Licensed to the Apache Software Foundation (ASF) under one or more
03: * contributor license agreements. See the NOTICE file distributed with
04: * this work for additional information regarding copyright ownership.
05: * The ASF licenses this file to You under the Apache License, Version 2.0
06: * (the "License"); you may not use this file except in compliance with
07: * the License. You may obtain a copy of the License at
08: *
09: * http://www.apache.org/licenses/LICENSE-2.0
10: *
11: * Unless required by applicable law or agreed to in writing, software
12: * distributed under the License is distributed on an "AS IS" BASIS,
13: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14: * See the License for the specific language governing permissions and
15: * limitations under the License.
16: */
17:
18: /**
19: * @author Nikolay A. Kuznetsov
20: * @version $Revision: 1.3.2.2 $
21: */package java.util.regex;
22:
23: /**
24: * Represents word boundary, checks current character and previous one if
25: * different types returns true;
26: *
27: * @author Nikolay A. Kuznetsov
28: * @version $Revision: 1.3.2.2 $
29: */
30: class WordBoundary extends AbstractSet {
31:
32: boolean positive;
33:
34: public WordBoundary(boolean positive) {
35: this .positive = positive;
36: }
37:
38: public int matches(int stringIndex, CharSequence testString,
39: MatchResultImpl matchResult) {
40: boolean left;
41: boolean right;
42:
43: char ch1 = stringIndex >= matchResult.getRightBound() ? ' '
44: : testString.charAt(stringIndex);
45: char ch2 = stringIndex == 0 ? ' ' : testString
46: .charAt(stringIndex - 1);
47:
48: int leftBound = matchResult.hasTransparentBounds() ? 0
49: : matchResult.getLeftBound();
50: left = (ch1 == ' ')
51: || isSpace(ch1, stringIndex, leftBound, testString);
52: right = (ch2 == ' ')
53: || isSpace(ch2, stringIndex - 1, leftBound, testString);
54: return ((left ^ right) ^ positive) ? -1 : next.matches(
55: stringIndex, testString, matchResult);
56: }
57:
58: /**
59: * Returns false, because word boundary does not consumes any characters and
60: * do not move string index.
61: */
62: public boolean hasConsumed(MatchResultImpl matchResult) {
63: // only checks boundary, do not consumes characters
64: return false;
65: }
66:
67: protected String getName() {
68: return "WordBoundary"; //$NON-NLS-1$
69: }
70:
71: private boolean isSpace(char ch, int index, int leftBound,
72: CharSequence testString) {
73: if (Character.isLetterOrDigit(ch) || ch == '_')
74: return false;
75: if (Character.getType(ch) == Character.NON_SPACING_MARK) {
76: for (; --index >= leftBound;) {
77: ch = testString.charAt(index);
78: if (Character.isLetterOrDigit(ch))
79: return false;
80: if (Character.getType(ch) != Character.NON_SPACING_MARK)
81: return true;
82: }
83: }
84: return true;
85: }
86: }
|