如果模式重复两次(非连续)匹配两种模式,则正则表达式

时间:2017-12-12 18:22:31

标签: regex

我有3个值,我试图匹配。 foobar123。但是我想匹配它们只有它们可以匹配两次。

在以下行中:

foo;bar;123;foo;123;

由于bar不存在两次,因此只会匹配:

foo;杆; 123; foo; 123;

我理解如何指定恰好匹配两个匹配(foo|bar|123){2}但是我需要使用反向引用才能使其在我的示例中有效。 我正在努力将这两个概念放在一起,为此做出有效的解决方案。

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

请参阅a demo on regex101.com

<小时/> 否则 - 如评论中所述 - 以编程方式拆分;并在之后使用一些编程逻辑。

例如在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