1

私はこの問題を解決しようとしています。パターンのある文字列があります。例えば。

CW1234 has been despatched to CW334545 

CWつまり、文字列は で始まり、任意の数の整数 (最大) が続くパターンを持つことができます16

これらすべてのパターンを空の文字に置き換えたい。文字列が次のようになるように

has been despatched to

次のことを試しましたが、最初の数字とそれに続く CW のみが置き換えられます。私はJavaが初めてです。どんな洞察も大いに役立ちます。

if(Pattern.matches(".*[C][W][0-9].*", str1)) {
    Matcher m = Pattern.compile(".*[C][W][0-9].*").matcher(str1);

    while(m.find()) {
        str1 = str1.replaceAll("[C][W][0-9]", "");
    }    
}

System.out.println(str1);
4

5 に答える 5

3

{n,m}最大桁数を強制するには、桁に量指定子が必要です。また、差し替えの場合、柄の有無を事前に確認する必要はありません。replaceAll一致するパターンがある場合にのみ置換し、そうでない場合は文字列をそのまま残します。

したがって、それらPatternMatcher一部をすべて削除し、正規表現を次のように変更します。

str1 = str1.replaceAll("CW\\d{0,16}", "");

少なくとも 1 桁が必要な場合は、それを作成し{1,16}ます。CWを別の文字クラスに入れる必要はありません。単一文字の文字クラスは、その文字自体と同じくらい優れています (特殊文字ではない場合)。\\dまた、の代わりに使用することもできます[0-9]

于 2013-09-23T08:12:14.003 に答える
2

不必要にパターンを構築し、文字列を数回照合しています。

str1 = str1.replaceAll("CW\\d+", "");

これで十分です。他のすべてのコードは冗長です。

パフォーマンスに問題がある場合は、手動で置換することもできます。

于 2013-09-23T08:14:50.480 に答える
1

あなたreplaceAllには次のものがありません+:

str1 = str1.replaceAll("[C][W][0-9]+", "");

+、正規表現を の直後の任意の桁数に一致させますCW

于 2013-09-23T08:09:40.760 に答える
1

String.replaceAll("CW[0-9\\s]*", "")必要なことを行い、番号の末尾のスペースも削除します。

別の注意点として、Pattern.compile() の要点は、必要な式をアプリケーションで一度コンパイルしてから、マッチャーを使用して出現箇所を見つける必要があるということです。したがって、あなたの使用法は(間違っているというよりは)不適切だと思います。 Pattern pattern = Pattern.compile("CD[0-9\\s]*");コード内で 1 回だけ発生し、それを次のように再利用します。 Matcher matcher = pattern.matcher(stringToMatch);

于 2013-09-23T08:33:13.420 に答える
1

あなたの正規表現は間違っています。試してみてください:

 String str1 = CW1234;
 str1 = str1.replaceAll("\\bCW\\d{0,16}\\b","");

「CW12134」が文字列内の単一のトークンである場合、または

 String str1 = CW1234;
 str1 = str1.replaceAll("^CW\\d{0,16}$","");

「CW1234」が完全な文字列の場合。

于 2013-09-23T08:16:08.567 に答える