我有三个值要匹配:foo
、bar
和123
。但我只想在它们可以匹配两次的情况下匹配它们。
在下面这行中:
foo;bar;123;foo;123;
由于bar
没有出现两次,它只会匹配:
foo
;bar;123
;foo
;123
;
我知道如何指定精确匹配两个结果,(foo|bar|123){2}
但是为了使其在我的示例中工作,我需要使用反向引用。
我很难将这两个概念结合起来并制定一个可行的解决方案。
我有三个值要匹配:foo
、bar
和123
。但我只想在它们可以匹配两次的情况下匹配它们。
在下面这行中:
foo;bar;123;foo;123;
由于bar
没有出现两次,它只会匹配:
foo
;bar;123
;foo
;123
;
我知道如何指定精确匹配两个结果,(foo|bar|123){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)
foo;bar;123;myfoo;123;
进行测试。 - Marco Luzzarav
字符。 - ctwheels(foo|bar|123).*\1
foo;bar;foo;bar;
怎么办? - ctwheels