Java 如何为regex编写CharMatcher等价项;字字符;?

Java 如何为regex编写CharMatcher等价项;字字符;?,java,regex,guava,Java,Regex,Guava,正则表达式\w与字符[A-Za-z0-9\完全匹配,这正是我现在需要的。 我想知道是否有简单的方法来制作相应的番石榴。 我做了以下工作(我不喜欢静态导入): 有一些预定义的匹配器,但是类似 private final static CharMatcher IDENTIFIER_CHAR = CharMatcher.ASCII .and(CharMatcher.JAVA_LETTER_OR_DIGIT) .or(CharMatcher.is('_')) .precomput

正则表达式
\w
与字符
[A-Za-z0-9\
完全匹配,这正是我现在需要的。 我想知道是否有简单的方法来制作相应的番石榴。 我做了以下工作(我不喜欢静态导入):

有一些预定义的匹配器,但是类似

private final static CharMatcher IDENTIFIER_CHAR = CharMatcher.ASCII
    .and(CharMatcher.JAVA_LETTER_OR_DIGIT)
    .or(CharMatcher.is('_'))
    .precomputed();
看起来一点也不好。在使用Java8之前,使用
forPredicate
。 这里没有什么真正的问题,只是太冗长了,不适合简单和(我想)普通的东西


有更好的解决办法吗?也许有人实现了类似于
newRegexLikeCharMatcher(“[A-Za-z0-9!]”)的东西

您建议的方法的实现可能是:

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) {
    final Pattern pattern = Pattern.compile(regex);
    return new CharMatcher() {
        @Override
        public boolean matches(char c) {
            return pattern.matcher(Character.toString(c)).find();
        }
    }.precomputed();
}


我写了这个简单的方法,它被使用了好几次,使它变得更好:

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;
}
范围内的私有静态字符匹配器(char startInclusive、char endInclusive、char…chars){
前提条件.checkArgument((chars.length&1)==0,“字符必须成对出现”);
CharMatcher结果=CharMatcher.inRange(开始包含,结束包含);

对于(int i=0;i我编写了这个简单的方法,它被使用了好几次,使它变得更好:

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;
}
范围内的私有静态字符匹配器(char startInclusive、char endInclusive、char…chars){
前提条件.checkArgument((chars.length&1)==0,“字符必须成对出现”);
CharMatcher结果=CharMatcher.inRange(开始包含,结束包含);

对于(int i=0;i您的第二个选项基本上就是我要使用的。记住,这个成本应该只在整个代码库中存在一次。@Louis Wasserman:如果我只做一次,我不会问。我有一些类似的模式……但现在我发现我可以减少它们的数量,所以现在好多了。可能没有理由要求一个新的模式功能,但足够我自己写东西了。你的第二个选择基本上就是我会使用的。记住,这个成本在你的整个代码库中应该只有一次。@Louis Wasserman:如果我只做一次,我不会问。我有一些类似的模式……但现在我发现我可以减少它们的数量,所以这更好不w、 可能没有理由要求一个特性,但足以让我自己编写一些东西。我实际上在寻找一些特殊的东西,但考虑到我陈述问题的方式,我必须接受你的答案。你的解决方案有两个小问题:1.它也接受像
ab*| c+
这样的模式。2.作为
谓词需要一些时间de>会被评估2**16次。对于我的用例来说,这一点都不重要。此外,如果需要,它可以很容易地针对简单的模式进行优化。我实际上是在寻找一些特殊的东西,但考虑到我陈述问题的方式,我必须接受你的答案。你的解决方案有两个小问题:1.它也接受像
ab*| c+.2.
谓词
计算2**16次需要一些时间。对于我的用例来说,这一点都不重要。此外,如果需要,它可以很容易地针对简单模式进行优化。
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;
}