【问题标题】:How can I skip/cancel the matching regex if something is found before the end of the pattern?如果在模式结束之前找到某些内容,我如何跳过/取消匹配的正则表达式?
【发布时间】:2014-04-03 09:11:44
【问题描述】:

我正在尝试制作两个彼此专有的正则表达式模式,用于 Java。

正则表达式一:

匹配[[]] 之间的任何内容,除了|(管道)字符或\r\n 换行符,捕获完整匹配并且仅将[[]] 之间的文本分为第1 组和2分别:

正则表达式:(\[\[([^|\r\n]*?)]])

应该返回 2 个完整的匹配项,输入如下:

[[wikipage&sfd/weird-]]
[[The whitespace.con_vention/+-test]]

正则表达式二:

匹配[[]] 之间的所有内容,|(管道)字符或\r\n 换行符除外,将完整匹配项和仅| 之前的文本分别捕获到第 1 组和第 2 组:

正则表达式:(\[\[([^|\r\n]*?)\|.*?]])

应该返回 2 个完整的匹配项,输入如下:

[[SandBox|the sandbox]]
[[SandBox|the.sandbox_/=test]]

但输入如下:

Test [[wiki:1]], [[wiki:page]test|test ]one]], [[wiki:1|page one]]

正则表达式二的第一个完整匹配是:

[[wiki:1]], [[wiki:page]test|test ]one]]

regex two的第二个完整匹配是:

[[wiki:1|page one]]

虽然我预计只有两场这样的完整比赛:

[[wiki:page]test|test ]one]]

[[wiki:1|page one]]

我已经尝试过像这样的负前瞻:(\[\[([^|\r\n]*?)(?!]])\|.*?]]),但如果它找到]],它只会回溯并重用正则表达式的第一部分。

所以我的问题是: 如果在| 之前找到]],我该如何跳过/取消整个正则表达式?

【问题讨论】:

  • ticket 来自哪里?你把它和wiki混在一起了吗?还要澄清一下,“First Full Match”是第一个正则表达式的结果,“Second FF”是第二个正则表达式的结果?
  • 给出输入和预期的输出。谢谢
  • 是的,我把一些例子弄混了,现在修复了
  • 您的符号非常混乱。根本不清楚输入和输出是什么。您说匹配是“[[wiki:1]]”,但在上面的示例中,该字符串甚至没有出现。有点不对劲。请更清楚。输入、正则表达式、预期匹配、实际匹配。
  • @bertuslakkis:更清楚了,谢谢。

标签: java regex


【解决方案1】:

如果您不想在第一个| 之前允许]],您可以使用negative lookahead assertion 来实现:

\[\[((?:(?!]])[^|\r\n])*)\|.*?]]

说明:

\[\[        # Match [[
(           # Match and capture in group 1...
 (?:        # (Start of non-capturing group)
  (?!]])    # ... (unless the text "]]" is directly ahead)
  [^|\r\n]  # ... any character except pipes or newlines
 )*         # repeat as necessary (lazy evaluation is not needed here)
)           # End of capturing group
\|          # Match a pipe
.*?         # and any number of characters until
]]          # the next instance of ]]

live on regex101.com

【讨论】:

  • 所以为了达到我想要的效果,我必须在[^|\r\n]*? 前面使用负前瞻,并将其放在非捕获组中。谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 2012-03-07
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多