【问题标题】:Replace text between two symbols with regex用正则表达式替换两个符号之间的文本
【发布时间】:2015-12-17 21:05:52
【问题描述】:

这应该很简单,但我不知道正则表达式......我在这里看到了很多类似的问题,但没有一个能准确地解决我想要的问题。 我有这个字符串:

String s = "randomStuff§dog€randomStuff"; //randomStuff is random letters and numbers, it's not a word

我想用bird替换dog(并不总是dog,不要将它包含在正则表达式中),所以输出应该是:

String s = "randomStuff§bird€randomStuff";

我现在用的是

s = s.replaceAll("\\§(.*?)\\€", "bird");

但这也会删除 § 和 € 符号。如何保留这些符号?

【问题讨论】:

  • 还有一点不清楚:random§random2§random3€random4 呢?还有:a€bc€d§e§h?
  • 什么?如果您说的是在 randomStuff 中有一个 § 符号的机会,那么在代码中是不可能的。

标签: java regex replace replaceall


【解决方案1】:

试试:

s = s.replaceAll("\\§(.*?)\\€", "§bird€");

【讨论】:

  • 还有这么差的表现。这里也不考虑换行符。如果需要在两个符号之间匹配一些未知文本,为什么要使用惰性点匹配?一个否定字符类是唯一正确的答案,恕我直言。此外,这些 § 不需要转义。另外,如果以后不使用(在模式和替换中不使用反向引用),为什么还要使用捕获组(另一个开销)?
  • 我也使用了这个解决方法,但我想要一个真正的替换而不丢弃这两个符号。 :)
【解决方案2】:

你可以在你的正则表达式中使用这个lookbehind断言:

s = s.replaceAll("(?<=§)[^€]*", "bird");

RegEx Demo

【讨论】:

  • Nir Levy 的答案更适合这个问题。原因 - 应尽可能避免前瞻/后验检查,因为它们会带来不必要的代码/执行复杂性。
  • 更好的套件在这里是主观的......避免重复§是使用环视或捕获组的一个很好的理由。性能是另一个原因,因为 .*? 在较大的文本中表现不佳。
  • 我可能错了,但据我所知.*?与 [^€]* 相比应该具有相似的性能。我绝对同意替换“。*?”使用 "[^€]*" 是个好主意,但这与前瞻/后瞻无关。
  • 这样我得到了输出 randomStuff§dog€bird。它取代了第二个 randomStuff。
  • @anubhava:我的错,我很傻,没有正确复制它。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 2020-06-11
  • 2022-12-24
  • 2016-07-21
相关资源
最近更新 更多