0

正規表現\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 でクロージャー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 に答える