0

文があると言う

そのサム・アイ・アム

2 つの単語が同じシーケンス "am" で終わります。2 番目のシーケンスが最後の単語です。

このような文に一致する正規表現を作成する必要があります。シーケンスは任意の文字列である可能性があります。

言語はJavaです。私がよく理解していないのは、文内の何かに一致し、残りを無視する方法です。

Javaテストの準備問題です。

ありがとうございました。

これは私がテストに使用しているコードです

public static void doMatching(){

    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    try {

        String pattern, s;
        System.out.print("Pattern: ");
        pattern = in.readLine();
        while (!pattern.equals("quit")){
            System.out.print("String: ");
            s = in.readLine();
            System.out.println(Pattern.matches(pattern, s));
            System.out.print("Pattern: ");
            pattern = in.readLine();
        }
        } catch (IOException e){
            System.out.println("Error!");
    } catch (Exception e2){
        System.out.println("Unknown!");
    }

}


public static void main(String[] args) {
    // TODO code application logic here

    doMatching();
}

そして、これが結果です

Pattern: (\\w+\\b).*\\b\\1$
String: that sam-i-am
false
4

3 に答える 3

3

検索している正規表現は次のとおりです。

(\w+\b).*\b\1$

使用できることを除外する必要がある場合は、これには文字としてアンダースコアも含まれます[a-zA-Z]

\w任意の文字
+に一致する前の式に1回以上一致し、貪欲な方法
\bで単語の境界に一致します。幅ゼロの一致です。結果をグループ化して保存し、改行が前の式と0回以上一致する場合を除いて、
()後から使用できるようにします。貪欲な方法で最初の逆参照であり、最初にキャプチャされたものと一致します。幅はゼロです。文字列の終わりに。
.
*
\1()
$

ゼロ幅の一致は、実際には文字を含まない一致です。

于 2012-11-13T23:45:59.500 に答える
3
"(\\w+\\b).*\\b\\1$"

これは、単語の終わりにある重要な数の単語文字(\\w+\\b)と一致し、文字列の最後で完全な単語として一致することを保証します。

于 2012-11-13T23:46:51.533 に答える
0

ここには他にも良い答えがありますが、これはまだより適切だと思います:

([a-zA-Z]+)\b.+\b\1$

頭を悩ませているかもしれませんが、RegEx を使用する場合は、できる限り簡潔かつ慎重に記述することをお勧めします。

ここでの文字範囲\wは、質問の性質のためよりも優れているようです. 最初の単語境界をキャプチャ グループの外に移動した方がよいと思います。そして.+vs.単語以外の文字が少なくとも 1 つ存在する必要.*があるためです(ただし、単語の境界と組み合わせると、ほぼ確実に一致します)。.*

于 2012-11-14T00:04:38.100 に答える