我有一些带有小写字母、点、括号和大于和小于符号的文本。假设我想匹配每行上的子字符串,(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运算符有什么影响。这是怎么回事
1条答案
按热度按时间c86crjj01#
您的问题是
[a-z()]+
在输入中不需要括号,因此它匹配hello
。此外,交替匹配从左到右,因此.hello
成功匹配,并且当输入具有尖括号时,引擎停止在那里。为了解决这个问题,require 括号(彼此一致),通过交替括号及其内容,放置在 * 初始部分之后,所以:
字符串
请参阅live demo。
这种方法(可能)有更严格的优点;你的正则表达式将匹配从点开始的所有内容
型
这可能是不想要的(尽管输入可能不具有语法上无效的内容)。