RegEx中的lookahead问题

s1ag04yj  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(81)

我在正则表达式的lookahead中仍然有问题。在这个例子中,我不确定我是误解了lookahead的意图,还是我只是使用了错误的语法。

初始情况

输入行可以如下所示,其中onetwo应该是结果。

  1. [[one][two]]
  2. [[one]]
    中间的][是可选的。
    我最初的正则表达式模式只适合第一个例子中的两个。
^\[\[(.*)\]\[(.*)\]\]$

导致

首次修改

我扩展了我的模式,因为可选的][带有一个“非捕获组”。

^\[\[(.*)(?:\]\[)?(.*)\]\]$

导致

使用lookahead进行二次修改

现在恕我直言,前瞻性开始考虑了。我说得对吗?第一组应该“捕获”(提取字符串)直到][出现。][就像一个停止标志。
现在我在雾里看花,像这样的东西不工作:

^\[\[((?!\]\[).*)(\]\[)?(.*)\]\]$
falq053o

falq053o1#

你可以用

^\[\[([^][]*)(?:]\[([^][]*))?]]$

参见regex demo

  • 详情 *:
  • ^-字符串的开头
  • \[\[-[[字符串
  • ([^][]*)-第1组:[]以外的零个或多个字符
  • (?:]\[([^][]*))?-][+组2的可选序列:除[]之外的任意零个或多个字符
  • ]]-]]子字符串
  • $-字符串结束。

如果您可以在[[][之间,然后在][和最后一个]]之间使用任何字符,则可以使用

^\[\[((?:(?!]\[).)*)(?:]\[(.*))?]]$

参见this regex demo

  • 详情 *:
  • ^-字符串的开头
  • \[\[-[[字符串
  • ((?:(?!]\[).)*)-第1组:除换行符字符以外的任何字符,零个或更多,但尽可能多地出现,不开始][字符序列
  • (?:]\[(.*))?-][的可选序列,然后第2组捕获除换行符字符以外的任何零个或多个字符,尽可能多
  • ]]-]]字符串
  • $-字符串结束。

相关问题