0

正则表达式\w与 characters 完全匹配[A-Za-z0-9_],这正是我现在需要的。我想知道是否有任何简单的方法可以创建相应的 Guava 的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 中使用闭包forPredicate之前也不会使用。这里没有真正的问题,对于简单且(我猜)常见的事情来说,它太冗长了。

有更好的解决方案吗?也许有人实施过类似的东西newRegexLikeCharMatcher("[A-Za-z0-9_]")吗?

4

2 回答 2

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();
}
于 2012-09-12T09:18:28.150 回答
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工作)。

于 2012-09-12T10:12:11.703 回答