RegEx:不允许子catchgroup中的字符串

yfwxisqw  于 2023-04-07  发布在  其他
关注(0)|答案(3)|浏览(123)

我仍然有一个工作的正则表达式模式。现在我发现了一个新的情况下,没有捕捉到我的第一个解决方案确实干扰了以前的情况。
我想提取一个字符串的三个部分。我使用Python3来完成这个任务,并且在regex101.com上进行了测试。
下面是一个示例输入字符串:

foo:bar][bluered

得到的子字符串应该是foobarblured。我可以通过RegEx模式(Python3)处理这个问题。

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

让我用自己的话来描述

  • :之前的第一个子字符串(foo)是可选的。该模式也适用于输入bar][bluered
  • 第二个和第三个应该在那里,并通过][划分。

问题

现在的问题情况是,第一个子串丢失,第三个子串包含:

bar][blue:red

模式给出了结果子串bar][bluered,第三个子串被忽略。这里的 expected 结果是第一个空的子串,然后bar作为第二个,blue:red作为第三个。

我的方法

我添加了一个检查][

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

这确实可以捕获像bar][blue:red这样的输入。但是现在的问题是,第一个和第二个子串之间的:被忽略了:

foo:bar][blue:red

结果是一个空的第一个子串,第二个是foo:bar,第三个是blue:red。我确实需要foo作为第一个,bar作为第二个,blue:red作为第三个。
现在我有点困惑如何更进一步。我想我需要忽略第三组中][之后的:,即使第一组和第二组之间没有:(在][之前)。
我需要找到一个对两种类型的输入字符串都有效的解决方案

bar][blue:red
foo:bar][blue:red
  • EDIT*:尝试了lookahead,但不起作用。只有在][之前,它才应该“意味着”匹配:
^(?:([^:]+(?=\]\[)):)?(.*?)(?:]\[(.*))?$
          ^^^^^^^^^

但也许这是正确的方向?

c86crjj0

c86crjj01#

为了便于解释,“特殊”字符被定义为:[]之一。

^               # At the beginning of the string/line
(?:             # Match an
  ([^:[\]]+)    #                   group consisting of 1+ non-special characters
  :             #                                       followed by a colon
)?              #          optional
([^:[\]]*?)     # then 0+ non-special characters, lazily,
(?:             # then another          group, consisting of
  ]\[(.*)       #                                            literal '][' and 0+ characters
)?              #              optional
$               # followed by the end of string/line.

试试on regex101.com
如果要匹配foo:bar:baz:boo,则第二个捕获组应更改为([^[\]\n]*?)(无冒号):

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

试试on regex101.com

de90aj5v

de90aj5v2#

您可以Assert][不应该出现在第一个组中,对第一个捕获组中的每个位置使用负前瞻Assert:

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

z9zf31ra3#

根据所提供的描述,我认为很简单

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

应该够了
它将找到最后一个][和它之前的:(如果存在)。
| 输入|第一场比赛|秒|第三|
| --------------|--------------|--------------|--------------|
| foo:bar]bluered|福|杆|发蓝的|
| foo:bar][blue:red|福|杆|蓝色:红色| | foobar][蓝色:红色||福巴|蓝色:红色|
| [红色||非洲广播电台|红色|
| foo:bar]blue:red][sdsd:df|foo:bar][蓝色|红色|sdsd:df|
演示here

相关问题