我仍然有一个工作的正则表达式模式。现在我又发现了一个没被抓住的案子我的第一个解决方案确实干扰了前面的情况。
我想提取一个字符串的三个部分。我使用Python3,并在regex101.com上进行了测试。
下面是一个示例输入字符串:
foo:bar][bluered
结果子串应该是foo
,bar
和blured
。我可以通过RegEx模式(Python3)来处理这个问题。
^(?:([^:]+):)?(.*?)(?:][(.*))?$
让我用自己的话来描述
:
之前的第一个子字符串(foo
)是可选的。该模式也适用于输入bar][bluered
。- 第二和第三应该在那里,并通过
][
划分。
问题现在的问题是第一个子字符串缺失,第三个子字符串包含:
。
bar][blue:red
模式给出结果子字符串bar][blue
和red
,第三个子字符串被忽略。期望的结果在这里是一个空的第一个子字符串,然后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:尝试向前看,但不工作。它应该"意味着";只匹配][
前面的:
。
^(?:([^:]+(?=][)):)?(.*?)(?:][(.*))?$
^^^^^^^^^
但也许这是正确的方向?
标题>为了便于解释,使用" special ";字符被定义为:[]
之一。
^ # 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.
在regex101.com上试试。
如果您想匹配foo:bar:baz:boo
,第二个捕获组应该更改为([^[]n]*?)
(没有冒号):
^(?:([^:[]]+):)?([^[]]*?)(?:][(.*))?$
在regex101.com上试试。
您可以断言][
不应该出现在第一组中,对第一个捕获组中的每个位置使用否定的forward断言:
^(?:((?:(?!][)[^:])*):)?(.*?)(?:][(.*))?$
根据提供的描述,我相信简单的
^(?:(.*):)?(.*)][(.*)$
应该足够了。
它会找到最后一个][
和:
在它之前(如果存在)。