我有一个字符串,例如:
There exists a word *random*.
random
将是一个随机词。
我如何使用正则表达式将 random
的每个字符替换为 *
并得到以下结果:
There exists a word ********.
因此 *
替换了每个字符,在本例中为 6 个字符。
请注意,我只是要替换单词 random
,而不是周围的 *
。
到目前为止,我有:
str.replaceAll("(\\*)[^.]*(\\*)", "\\*");
但是它将*random*
替换为*
,而不是想要的*********
(总共8个) .
任何帮助,非常感谢...
最佳答案
如果你只有一个这样的词:-
就当前示例而言,如果您只有一个这样的单词,那么您可以使用一些 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);
上面的模式用*
替换了所有不跟在包含偶数个*的字符串后面的字符,直到最后。
适合自己的就用吧。
我将添加对上述正则表达式的解释:-
(?<! ) // 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.
现在上面的模式将只匹配那些在一对星星内
的单词。前提是您没有任何不平衡的星星
。
关于Java:与正则表达式匹配并替换每个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14681175/