regex 为什么使用正则表达式OR运算符交换元素顺序“|“事?

hof1towb  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(90)

我有一些带有小写字母、点、括号和大于和小于符号的文本。假设我想匹配每行上的子字符串,(1)以句点开始,(2)包含任意数量的字母,(3)有非负数的括号或</>符号,但 * 不是两者都有 *。因此,鉴于这一文本,

foobar.hello(world)
foobar.hello<world>
foobar.hello>>>world<>(baz)

字符串
我想在第一行匹配.hello(world),在第二行匹配.hello<world>,在第三行匹配.hello>>>world<>(因为我不能混合括号和</>符号)。
我可以使用两个正则表达式来匹配我想要的字符串,\.[a-z()]+\.[a-z<>]+。然而,因为正则表达式在组合类似模式时更有效,所以我尝试将它们组合成一个具有逻辑OR |的正则表达式:

\.(?:[a-z()]+|[a-z<>]+)


After trying this online,而正则表达式匹配我想要的第一行的子字符串,对于第二和第三行,它只匹配.hello。然而,当我切换元素的顺序时,会发生相反的情况-第一行匹配为.hello,第二行和第三行按需要匹配。这让我很惊讶,因为我不认为顺序对OR运算符有什么影响。这是怎么回事

c86crjj0

c86crjj01#

您的问题是[a-z()]+在输入中不需要括号,因此它匹配hello。此外,交替匹配从左到右,因此.hello成功匹配,并且当输入具有尖括号时,引擎停止在那里。
为了解决这个问题,require 括号(彼此一致),通过交替括号及其内容,放置在 * 初始部分之后,所以:

\.[a-z]+(?:\([a-z]+\)|<[a-z]+>)

字符串
请参阅live demo
这种方法(可能)有更严格的优点;你的正则表达式将匹配从点开始的所有内容

foobar.()()()(((((()foo


这可能是不想要的(尽管输入可能不具有语法上无效的内容)。

相关问题