簡體   English   中英

如何為正則表達式“單詞字符”編寫等效的CharMatcher?

[英]How to write the CharMatcher equivalent for the regex “word character”?

正則表達式\\w與字符[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_]")嗎?

建議的方法的實現可以是:

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();
}

我寫了這個簡單的方法,該方法被使用了兩次,使它變得更好了:

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”三元組時,都會將其解釋為范圍,否則會添加單個匹配字符(因此,前導和尾隨的破折號會按字面意義進行解釋,即使像-ab-abc這樣的奇怪事物也可以使用)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM