正则表达式\w
完全匹配字符[A-Za-z0-9_]
,这正是我现在所需要的。
我想知道是否有任何简单的方法来创建相应的番石榴CharMatcher。
我做了以下(我不喜欢静态导入):
private final static CharMatcher IDENTIFIER_CHAR = CharMatcher.is('_')
.or(CharMatcher.inRange('A', 'Z'))
.or(CharMatcher.inRange('a', 'z'))
.or(CharMatcher.inRange('0', '9'))
.precomputed();
有一些预定义的匹配器,不过类似
private final static CharMatcher IDENTIFIER_CHAR = CharMatcher.ASCII
.and(CharMatcher.JAVA_LETTER_OR_DIGIT)
.or(CharMatcher.is('_'))
.precomputed();
看起来没有任何好转。在Java 8中获取closures之前,也没有使用forPredicate
。
这里没有真正的问题,对于简单而且(我猜)常见的事情来说,它太冗长了。
任何更好的解决方案?也许有人实现newRegexLikeCharMatcher("[A-Za-z0-9_]")
之类的东西?
答案 0 :(得分:3)
您建议的方法的实现可以是:
public CharMatcher newRegexLikeCharMatcher(String regex) {
final Pattern pattern = Pattern.compile(regex);
return new CharMatcher() {
@Override
public boolean matches(char c) {
return pattern.matcher(Character.toString(c)).find();
}
}.precomputed();
}
或
public CharMatcher newRegexLikeCharMatcher(String regex) {
return CharMatcher.forPredicate(Predicates.compose(Predicates.containsPattern(regex), Functions.toStringFunction()))
.precomputed();
}
答案 1 :(得分:0)
我写了这个简单的方法,它使用了几次并使它更好一点:
private static CharMatcher inRanges(char startInclusive, char endInclusive, char... chars) {
Preconditions.checkArgument((chars.length & 1) == 0, "The chars must come in pairs");
CharMatcher result = CharMatcher.inRange(startInclusive, endInclusive);
for (int i=0; i<chars.length; i+=2) result = result.or(CharMatcher.inRange(chars[i], chars[i+1]));
return result;
}
我担心我的这种情况不够普遍,每个用户都可以像我一样为他们的特殊情况制定解决方案......
我发现上面的解决方案仍然不切实际(输入的撇号太多)而是创建了这个简单的方法
public static CharMatcher newRegexLikeCharMatcher(String s) {
CharMatcher result = CharMatcher.NONE;
for (int i=0; i<s.length(); ++i) {
if (i+2 < s.length() && s.charAt(i+1) == '-') {
result = result.or(CharMatcher.inRange(s.charAt(i), s.charAt(i+2)));
i += 2;
} else {
result = result.or(CharMatcher.is(s.charAt(i)));
}
}
return result;
}
每当遇到“char-dash-char”三元组时,它会将其解释为一个范围,否则它会添加一个匹配的字符(因此前导和尾随破折号按字面解释,甚至是奇怪的事情,如-a-b-
和a-b-c
工作)。