考虑到两个正则表达式,我们是否可以编写一个正则表达式来表示它们在以下两种差异感中的“交叉点”,以便匹配字符串中的任何位置?
鉴于两个正则表达式expr1
和expr2
,我们可以写一个正则表达式
它表示两个给定正则表达式的交集,在集合交集的意义上,它
正则表达式可用于匹配字符串中的任何位置吗?
例如,expr1
为(123|12345|abc|abcde)
,expr2
为
(345|12345|abc|de)
。我想找一个代表的正则表达式
(12345|abc)
。
因此,在将正则表达式应用于blah12345blahabcdeblah
时,匹配
在应用正则表达式时,12345
和abc
是blah123blahabcblah
和abc
(?=^expr1$)(?=^expr2$).*
,匹配为^
。
$
有锚点expr1
和expr2
,可以阻止它在字符串中间找到匹配项。
鉴于两个正则表达式expr1
和(123|abcde)
,我们如何编写正则表达式
它代表了两个给定正则表达式的“交集”
感觉它由那些字符串组成,每个字符串
并且正则表达式可用于匹配字符串中的任何位置?
例如,expr2
为(12345|abc)
,(12345|abcde)
为blah12345blahabcdeblah
。
我想找一个代表12345
的正则表达式
因此,在将正则表达式应用于abcde
时,匹配
是blah123blahabcblah
和123
,同时应用正则表达式
abc
,没有匹配项(12345
和123
不匹配)。
在应用正则表达式匹配字符串中间时,第2部分中“交集”的定义比第1部分中的定义更自然:
在上面的示例中,只要12345
匹配,expr1
也会出现,expr2
似乎同时位于123
和12345
,应该在他们的“十字路口”。如果blah123blahabcblah
匹配,则123
不一定匹配,例如,在abcde
中,因此{“1}}不会在”交叉点“中考虑。 abc
的类似解释是{{1}}并不在“交集”中。
谢谢!
答案 0 :(得分:2)
第1部分
我还没有找到解决方案,会再看一下。
回答第2部分
这是一个适用于正则表达式引擎的解决方案,允许反向引用外观,例如.NET和Matthew Barnett对Python的优秀regex
模块。
对于你的例子:
(?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))
答案 1 :(得分:1)
这些应该这样做:
/(?=expr1(.*)$)expr2(?=\1$)/
/(?=expr1)(?=expr2)/