【问题标题】:Is it possible to invert a call to String's replaceAll method?是否可以反转对 String replaceAll 方法的调用?
【发布时间】:2014-12-04 13:07:43
【问题描述】:

例如...

String s = "abcxyzabcxyz";
s.replaceAll("xyz", "---");

这通常会给我"abc---abc---"。我怎样才能让它给我"---xyz---xyz"

【问题讨论】:

  • 嗯,我的第一张照片是s.replaceAll("abc", "---"),但我想这不是你想要的,对吧?
  • 应该如何处理:String s = "abcwxyzabctuvwxyz";, s.replaceAll("xyz", "123");
  • 应该不会太难...replaceAll将正则表达式作为第一个参数
  • @Eypros 我猜他想要的是某种“用--- 替换除xyz 之外的所有内容”,而不是“用--- 替换xyz”。很可能问题可以改写为:请告诉我如何相应地使用正则表达式替换。
  • 问题不完整

标签: java string str-replace


【解决方案1】:

String#replaceAll 接受正则表达式,如果我理解正确,您可以使用:

s.replaceAll("[^xyz]", "---")

解释:

[^xyz] 表示任何字符,不是“x”、“y”或“z”之一。

为了将“xyz”作为一个系列否定,请使用:

^(?!.*xyz).*$

【讨论】:

  • 如果你有 "xabcxyzaxbcxyz" 它会返回 x---xyz-x--xyz。正则表达式应该以相同的顺序包含三个字母,而不是它们的任何单一外观。我认为应该使用this 来构建正则表达式
  • 第二个正则表达式 ^(?!.*xyz).*$ 要么替换整个字符串,要么不替换。我认为您想使用@jesantana 链接中接受的答案:stackoverflow.com/a/1240337/1969638
【解决方案2】:

你可以用这个...

s.replaceAll("[^xyz]", "-");

在更正式的 Java 方法中,我会使用 Pattern 类,如下所示:

Pattern p = Pattern.compile("[^xyz]");
s.replaceAll(p.pattern(), "-");

【讨论】:

  • 正如 Adrian Nasui 在另一条评论中所说,这会产生 abc---------abc---------
  • 如果字符串为“xabcxyzaxbcxyz”返回x---xyz-x--xyz,就会出现问题。正则表达式应以相同的顺序包含三个字母,而不是它们的任何单一外观
  • 这将是最好的方法,因为它会替换单个字母,而不是像其他人假设的那样作为一个组。
猜你喜欢
  • 2012-06-07
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多