繁体   English   中英

我们可以使用任何预定义的函数和正则表达式替换字符串文字的特定部分吗

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM