【问题标题】:ReGex exclude character not giving correct result正则表达式排除字符未给出正确结果
【发布时间】:2021-04-18 16:48:59
【问题描述】:

在以下代码中,我尝试使用 replaceAll 将“@”添加到所有出现的名称(但排除已经使用“@”的名称)。

name = "Bob"
message = "Hi Bob"
message = message.replaceAll("[^@]" + name, "@" + name);

我从 多个 来源在线阅读到,要排除一个字符,你会用括号括起来,用插入符号。在尝试了一些组合之后,我发现如果你有message = "^Bob",它会以某种方式将其转换为“@Bob”。

我做错了什么?

【问题讨论】:

标签: java regex replace


【解决方案1】:

[^@] 是一个negated character class,它匹配并使用@ 之外的任何字符。由于您使用replaceAll,与此模式匹配的字符将被删除,@ 将与name 一起插入。

你可以使用

String name = "Bob";
String message = "Hi Bob";
message = message.replaceAll("\\b(?<!@)" + name + "\\b", "@$0");
System.out.println(message); 

请参阅 Java demoregex demo

详情

  • \b(?&lt;!@) - 前面没有 @ 字符的单词边界
  • Bob - 一句话
  • \b - 单词边界。

替换中的$0 是对整个匹配项的反向引用。

【讨论】:

  • 嗯,它有效,但我想知道为什么它比我想象的要复杂得多。如果您有时间,如果您能解释为什么我的正则表达式字符串不起作用,我将不胜感激。我目前有点困惑为什么 [^@] 不起作用。
  • @tenderporkk 我添加了解释。
  • tyvm!感谢所有帮助:D 也感谢您的解释,它帮助我更好地理解了一点
【解决方案2】:

使用[^@] 是一个negated character class,它实际上匹配除@ 之外的单个字符,@ 也可以匹配^ 字符。

您可以改用环视断言,它是非消耗性的,可以找到被空白边界包围的name

模式将是:

(?<!\S)Bob(?!\S)
  • (?&lt;!\S) 向左声明空白边界
  • Bob 字面上匹配
  • (?!\S) 断言右边的空白边界

在替换中,您可以使用完整匹配 $0 前面加上 @

Regex demo | Java demo

注意在 Java 中双重转义反斜杠。

String name = "Bob";
String message = "Hi Bob";
message = message.replaceAll("(?<!\\S)" + name + "(?!\\S)", "@$0");
System.out.println(message);

输出

Hi @Bob

【讨论】:

  • 啊好吧,这很有意义。正则表达式的 Tyvm,我还在学习它:D
  • 好吧,我很困惑。根据 OP,这是有道理的。我得到相同的输出,并且 OP 说我的不起作用。当您看到^Bob 时会发生什么?我的答案和另一个给^@Bob。这个只是给^Bob。然而,根据 OP,我仍然不知道我的失败之处。这就是我想知道的。我想我不清楚要求。
  • @tenderporkk ^Bob 的结果应该是什么?
【解决方案3】:

这样试试吧。

  • (?&lt;!@) + name 仅在前面没有 @ 时才表示
String test = "Bob @Bob @Bob Bob";
String name = "Bob";
String s = test.replaceAll("(?<!@)"+name, "@"+name);
System.out.println(s);

打印

@Bob @Bob @Bob @Bob

【讨论】:

  • 我认为这个行不通。我测试了一下,它前面没有加@
  • @tenderporkk 你能告诉我这是怎么失败的吗?对于字符串String test = "Bob @Bob @Bob ^Bob",它还返回"Bob @Bob @Bob ^@Bob"
  • 我的错,我测试了第三行,我没有注意到你使用了一个新的变量“s”,所以看起来它什么也没做。
猜你喜欢
  • 2018-09-26
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多