gpt4 book ai didi

regex - 如何为两个正则表达式的 "intersection"编写正则表达式,可用于匹配字符串中的任何位置

转载 作者:行者123 更新时间:2023-12-01 02:16:52 25 4
gpt4 key购买 nike

给定两个正则表达式,我们是否可以编写一个正则表达式来表示它们在以下两种不同意义上的“交集”,以匹配字符串中的任何位置?

  • 给定两个正则表达式 expr1expr2 , 我们可以写一个正则表达式吗
    在集合交集的意义上,它表示两个给定正则表达式的交集,并且
    正则表达式可用于匹配字符串中的任何位置?

    例如,expr1(123|12345|abc|abcde)expr2(345|12345|abc|de) .我想找到一个代表的正则表达式(12345|abc) .
    因此,当将正则表达式应用于 blah12345blahabcdeblah , 匹配
    12345abc , 而将正则表达式应用于blah123blahabcblah , 匹配是 abc .
    (?=^expr1$)(?=^expr2$).*有 anchor ^$ ,这会阻止它在字符串中间找到匹配项。
  • 给定两个正则表达式 expr1expr2 ,我们怎么写一个正则表达式
    它表示两个给定正则表达式的“交集”,在
    感觉它由那些字符串组成,每个字符串
  • 至少出现在两个正则表达式之一中,并且
  • 在两个正则表达式的其余部分有一个前缀

  • 并且正则表达式可用于匹配字符串中的任何位置?

    例如, expr1(123|abcde)expr2(12345|abc) .
    我想找到一个代表 (12345|abcde) 的正则表达式.
    因此,当将正则表达式应用于 blah12345blahabcdeblah , 匹配
    12345abcde ,同时将正则表达式应用于 blah123blahabcblah ,没有匹配项( 123abc 不匹配)。
    当应用正则表达式匹配字符串中间时,第 2 部分中“交集”的定义比第 1 部分中的定义更自然:

    在上面的例子中,只要 12345是匹配, 123也出现了,所以 12345似乎都在 expr1expr2 ,并且应该在它们的“交叉点”中。如果 123是一场比赛, 12345不一定匹配,例如,在 blah123blahabcblah 中, 所以 123在“交叉点”中不考虑。 abcde 的类似解释是和 abc不在“路口”。

    谢谢!

    最佳答案

    第 1 部分

    我还没有找到解决方案,会再看看它。

    回答第 2 部分

    这是一个适用于允许后向引用的正则表达式引擎的解决方案,例如 .NET 和 Matthew Barnett 的优秀 regex Python的模块。

    对于您的示例:

    (?x)
    (?=(12345|abc))(?=(123|abcde)) # AND the expressions
    (?: # take the longest match
    \1(?<=\2.*) #abcde, \1 is abc
    |
    \2(?<=\1.*) #12345, \2 is 123
    )

    一般来说:
    (?x)
    (?=(expr1))(?=(expr2)) # AND the expressions
    (?: # take the longest match
    \1(?<=\2.*)
    |
    \2(?<=\1.*)
    )

    我认为这行得通……但也许有一个我没有考虑过的极端情况。

    这是一些经过测试的 Python 代码。
    import regex
    pattern = r'''(?x)
    (?=(12345|abc))(?=(123|abcde)) # AND the expressions
    (?: # take the longest match
    \1(?<=\2.*) #abcde, \1 is abc
    |
    \2(?<=\1.*) #12345, \2 is 123
    )
    '''
    myregex = regex.compile(pattern)

    print ("--- blah12345blahabcdeblah ---")
    for match in myregex.finditer("blah12345blahabcdeblah"):
    print("Overall match: ", match.group(0))

    print ("--- blah123blahabcblah ---")
    for match in myregex.finditer("blah123blahabcblah"):
    print("Overall match: ", match.group(0))

    print ("--- blah12345blahabcdeblah12345 ---")
    for match in myregex.finditer("blah12345blahabcdeblah12378"):
    print("Overall match: ", match.group(0))

    关于regex - 如何为两个正则表达式的 "intersection"编写正则表达式,可用于匹配字符串中的任何位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24154025/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com