m.s*_*tos 3 java regex replace
我有一个字符串,例如:
There exists a word *random*.
Run Code Online (Sandbox Code Playgroud)
random将是一个随机的词.
如何使用正则表达式替换randomwith的每个字符*并获得此结果:
There exists a word ********.
Run Code Online (Sandbox Code Playgroud)
所以*替换每个字符,在这种情况下为6个字符.
请注意,我只是替换了单词random而不是周围环境*.到目前为止,我有:
str.replaceAll("(\\*)[^.]*(\\*)", "\\*");
Run Code Online (Sandbox Code Playgroud)
但它取代*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();
Run Code Online (Sandbox Code Playgroud)
为此,这是一个正则表达式解决方案(这是它开始变得有点复杂的地方): -
String str = "There exists a word *random*.";
str = str.replaceAll("(?<! ).(?!([^*]*[*][^*]*[*])*[^*]*$)", "*");
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
上面的模式替换了所有未跟随的字符,string containing even numbers of *直到最后,用a *.
无论哪种适合您,您都可以使用.
我将添加上述正则表达式的解释: -
(?<! ) // 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.
Run Code Online (Sandbox Code Playgroud)
现在上面的模式只匹配那些单词inside a pair of stars.只要你没有任何不平衡stars.