[英]Can we replace a specific part of a string literal using any predefined function and regex
我想在给定句子中用随机单词“$d”替换“&”。 我们可以只替换那些以 & 开头并后跟一个字符和一个空格的单词吗?
例子:-
输入:-
两个文字是 &a 和 &b 并在这里检查 &abc 和 &bac。
输出:-
两个字面量是 $da 和 $db 并且在这里也检查 &abc 和 &bac。
在上面的输入示例中,应该替换的唯一单词是 &a 和 &b(不应该替换完整的单词,只有两个单词中的 '&')因为这两个随机单词以 & 开头,后跟一个字符和一个空格。
对于 replaceAll() 函数,当我使用正则表达式时,它会替换整个单词:-
String str="Two literals are &a and &b and also check &abc and &bac here.";
str = str.replaceAll("\\&[a-zA-Z]{1}\\s", "\\$d");
System.out.println(str);
//output for this:-Two literals are $d and $d and also check &abc and &bac here.
//expected output:-Two literals are $da and $db and also check &abc and &bac here.
正确的代码是
str.replaceAll("&([a-zA-Z]\\s)", "\\$d$1")
这是在正则表达式中反向引用捕获组的示例,这里是一个很好的参考。 此外, 这是一个相关的 StackOverflow 问题。
本质上,括号内的匹配项 ( [a-zA-Z]\\s
) 匹配单个字母和一个空格。 这个匹配的值可以用$1
来引用,因为它属于捕获组 1。
所以我们用$d(a )
替换&(a )
) (括号来说明捕获的内容)。 感谢 u/rzwitserloot 提醒我 OP 想要 $ not &。
您可能想要一个称为前瞻的概念:您可以匹配存在的事物而无需“消耗”它。 你甚至可以匹配不存在的东西。 这就是你想要的:匹配&[az]
,但前提是向前看,我们不会看到另一个字母:
for (String test : List.of("Two literals are &a and &bcd", "A literal is &a", "How about &a?")) {
System.out.println(str.replaceAll("&(?=[a-zA-Z](?![a-zA-Z]))", "\\$d"));
}
也许相反,您希望单个字母只是在任何分词符上(即&z00
不应该变成$dz00
,即使z
之后没有字母。然后我建议:
"&(?=[a-zA-Z]\\b)"
阅读起来要简单得多!
几点注意事项:
(?=x)
是“积极的前瞻”。 它本身不匹配任何东西,但如果x
不是紧跟在匹配之后,则匹配失败。(?!x)
是“负前瞻”。 它本身不匹配任何内容,但如果x
紧跟在匹配之后,则匹配失败。$
在替换部分中具有特殊含义,因此我们需要对其进行转义。\\b
是“分词”的正则表达式:不匹配任何字符,但如果我们不在“分词”上则失败。 空格、点、输入结束、行尾、破折号、& 符号 - 很多东西都是断字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.