【问题标题】:Java regex skip matchJava 正则表达式跳过匹配
【发布时间】:2015-10-20 21:33:11
【问题描述】:

我需要捕获文本中的所有# 字符,除了那些被#[ ... #] 包围的字符。 我编写了 PCRE 版本 (online example),效果很好,但 Java 不支持 (*SKIP)(*FAIL)。

 #\[.*#\](*SKIP)(*FAIL)|#

是否有这个正则表达式的 Java 等价物?谢谢。

【问题讨论】:

  • 举一个你想匹配的字符串的例子。
  • @jamesjelo4kul:我的问题中有一个链接。为了更好的想象,我添加了一些文字。
  • @anubhava: 捕获,然后我可以用 Java 替换它...
  • @StefanH - 你想用什么替换#s?

标签: java regex pcre


【解决方案1】:

这使用了一个小技巧来匹配你不想要的#s,然后匹配捕获组中的其余部分:

#\[.*?#\]|(#+)

https://regex101.com/r/sU1kR2/1

您需要提取第一个捕获组以获得所需的#s。

如果您想捕获不属于或不在自定义括号中的每个#,您可以从捕获组中删除+,如下所示:

#\[.*?#\]|(#)

另外,如果您可以有 ##[text]# 这样的文本,那么您可能需要如下环顾:

#\[.*?#\]|(#(?!\[))

如果你可以使用\K(但我认为你不能在 Java 中使用),那么使用以下内容会更简单,因为你不必担心捕获组:

#\[.*?#\]\K|#

【讨论】:

  • 最后一个解决方案非常好,但我不能在Java中使用\K。第一个有效,谢谢。
  • 如果括号格式不正确,它会如何失败?合法表达式为#[This one is # ok#]
  • @MaxZoom - 好的,但看看我的属性形成右括号时会发生什么:regex101.com/r/sU1kR2/3
  • 好的,我知道了,自从我查看了 OP 帖子文本后,它发生了变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多