1

以下のパターンを適用しようとしています。

Pattern p = Pattern.compile(".*?");
Matcher m = p.matcher("RAJ");
StringBuffer sb = new StringBufffer();
while(m.find()) {
 m.appendReplacement(sb, "L");
}
m.appendTail(sb);

期待される出力 : LLL 実際の出力 : LRLALJL

上記の正規表現のドット (.) は、文字間の位置と一致しますか? そうでない場合、なぜ上記の出力が受信されるのですか

4

4 に答える 4

5

.*?任意の数の文字に一致しますが、正規表現全体に一致するのに必要な数だけ一致します (?* 消極的(怠惰とも呼ばれます) になります)。正規表現にはその後に何もないため、これは常に空の文字列 (文字の場所) と一致します。

少なくとも 1 文字を一致させたい場合は、 を試してください.+?。これは、正規表現の後に他に何もない. 場合と同じであることに注意してください。

于 2012-09-05T07:07:09.010 に答える
3

あなたはこれをやってそれを得ることができます:

String s = "RAJ";
s = s.replaceAll(".","L");                                                                                                                                                                                  
System.out.println(s);

Matcherとfindメソッドを使用してそれを行うことができますが、replaceAllは正規表現を受け入れます。

于 2012-09-05T07:10:50.207 に答える
2

.文字同士が一致するというわけではなく、*0以上で?なるべく少ないという意味です。そのため、式が探している他の何かが後に続かない場合、
「ゼロ以上のもの、および可能な限り少数」は常にゼロのものと一致します。これは可能な限り少ないためです。

.{1}LLL一度何かに一致するため、の出力になります。

于 2012-09-05T07:09:37.477 に答える
1

*正規表現内のは、.*?繰り返しがないか、それ以上ないことを意味します。少なくとも1つの文字を一致させる場合は、正規表現を使用し.+?ます。

于 2012-09-05T07:10:45.087 に答える