我想替换匹配给定模式的字符串中的文本。我写了下面的Java代码来做到这一点。
public static void main(String[] args) {
/* Block 1 */
String s1="123 Test Testing";
System.out.println(s1.replaceAll("\\bTest\\b", "<Replaced with Test Message>")); // Prints 123 <Replaced with Test Message> Testing
/* Block 2 */
String s2="123 Test] Test]ing";
System.out.println(s2.replaceAll("\\bTest\\]\\b", "<Replaced with Test Message>")); //Prints 123 Test] <Replaced with Test Message>ing
}
第一个块按预期工作。但是在第二个区块中,它不是替换字符串开头的Test]
,而是替换Test]ing
的一部分。
代码或正则表达式有什么问题吗?
如何匹配Test]
而不是Test]
Test]ing
答案 0 :(得分:3)
正则表达式中的\ b匹配单词边界,即单词\ w和非单词\ W字符之间的位置。由于您的模式中的]是非单词字符,因此在第一个位置(Test)中不存在具有以下空格的单词边界,但是在第二个位置(Test)中,其中]后面跟着字符我
要匹配第一个测试],您可以将正则表达式更改为
"\\bTest\\]\\B"
匹配]之后的非字边界。
答案 1 :(得分:1)
您需要从第二个块中删除正则表达式,而不是正常工作。 :)
System.out.println(s2.replaceAll("Test\\]", "<Replaced with Test Message>")); //Prints Test] <Replaced with Test Message>ing
输出:
<Replaced with Test Message> <Replaced with Test Message>ing
答案 2 :(得分:1)
\b
是Java正则表达式中的word boundary。
它适用于仅包含&#34; any lowercase letter, any uppercase letter, the underscore character, or any digit&#34;的单词,即[a-zA-Z_0-9]
根据测试] 不是一个单词,而\b
不适用于它。