そのような単語が1つしかない場合:-
現在の例に関する限り、そのような単語が1つしかない場合は、いくつかのString
クラスメソッドを使用して、正規表現から自分を救うことができます。
String str = "There exists a word *random*.";
int index1 = str.indexOf("*");
int index2 = str.indexOf("*", index1 + 1);
int length = index2 - index1 - 1; // Get length of `random`
StringBuilder builder = new StringBuilder();
// Append part till start of "random"
builder.append(str.substring(0, index1 + 1));
// Append * of length "random".length()
for (int i = 0; i < length; i++) {
builder.append("*");
}
// Append part after "random"
builder.append(str.substring(index2));
str = builder.toString();
あなたがそのような複数の単語を持つことができるならば:-
そのために、ここに正規表現の解決策があります(これは少し複雑になり始めるところです):-
String str = "There exists a word *random*.";
str = str.replaceAll("(?<! ).(?!([^*]*[*][^*]*[*])*[^*]*$)", "*");
System.out.println(str);
上記のパターンはstring containing even numbers of *
、最後まで続かないすべての文字を。に置き換えます*
。
どちらが適切でも、使用できます。
上記の正規表現の説明を追加します:-
(?<! ) // Not preceded by a space - To avoid replacing first `*`
. // Match any character
(?! // Not Followed by (Following pattern matches any string containing even number of stars. Hence negative look-ahead
[^*]* // 0 or more Non-Star character
[*] // A single `star`
[^*]* // 0 or more Non-star character
[*] // A single `star`
)* // 0 or more repetition of the previous pattern.
[^*]*$ // 0 or more non-star character till the end.
これで、上記のパターンは、である単語のみに一致しますinside a pair of stars
。不均衡がない場合stars
。