我有3个值,我试图匹配。 foo
,bar
和123
。但是我想匹配它们只有它们可以匹配两次。
在以下行中:
foo;bar;123;foo;123;
由于bar
不存在两次,因此只会匹配:
foo
;杆; 123
; foo
; 123
;
我理解如何指定恰好匹配两个匹配(foo|bar|123){2}
但是我需要使用反向引用才能使其在我的示例中有效。
我正在努力将这两个概念放在一起,为此做出有效的解决方案。
答案 0 :(得分:2)
您可以使用
(?<=^|;)([^\n;]+)(?=.*(?:(?<=^|;)\1(?=;|$)))
<小时/> 细分,这是
(?<=^|;) # pos. loobehind, either start of string or ;
([^\n;]+) # not ; nor newline 1+ times
(?=.* # pos. lookahead
(?:
(?<=^|;) # same pattern as above
\1 # group 1
(?=;|$) # end or ;
)
)
\b # word boundary
([^;]+) # anything not ; 1+ times
\b # another word boundary
(?=.*\1) # pos. lookahead, making sure the pattern is found again
<小时/>
否则 - 如评论中所述 - 以编程方式拆分;
并在之后使用一些编程逻辑。
例如在Python
中查找演示(也可以针对其他语言进行调整):
from collections import Counter
string = """
foo;bar;123;foo;123;
foo;bar;foo;bar;
foo;foo;foo;bar;bar;
"""
twins = [element
for line in string.split("\n")
for element, times in Counter(line.split(";")).most_common()
if times == 2]
print(twins)
答案 1 :(得分:1)
确保在与#34;。*&#34;匹配的文本之间留出空间,这应该匹配至少出现两次的任何值:
(foo|bar|123).*\1