我有一个正则表达式来提取两个标记,分隔符[']和撇号之间的单词,如“ Stack Overflow ”。问题是,为什么这个正则表达式不起作用?
正则表达式:
(['])|'([^']*)'
这是一个解释它的链接: Regular Expression
仅用于提取撇号,但是在撇号之间的单词
注意:我需要像'Stack Overflow'一样单独提取撇号和撇号之间的任何单词。
结果如下:
问候。
答案 0 :(得分:5)
你的正则表达式要么匹配单引号或引号之间的内容,但它是独占的或你拥有它的方式。要将它们作为捕获组,您可以使用正则表达式:
(')([^']*)(')
获得第一个引用,然后所有不是引用然后是最后一个引用
答案 1 :(得分:4)
TL; DR 因为它是short-circuit。
在or
条件下,一旦匹配第一个正则表达式,就不需要计算第二个正则表达式。因为True | anything
始终获得True
,对吧?
考虑你的正则表达式
regex = (['])|'([^']*)'
text = 'Stack Overflow'
运行正则表达式以匹配text
(['])
与'
和'
匹配,然后将其捕获到$1
和$2
。
完成! (跳过第二个正则表达式,因为您将它们与or
连接)
另一个证据:
regex = (['])|'([^']*)'
text = 'Stack Overflow'
获取
$1 = `'`
$2 = `'`
但是
regex = '([^']*)'|(['])
text = 'Stack Overflow'
获取
$1 = `Stack Overflow`
你会看到只有第一个工作!
因此,我建议您使用此正则表达式而不是:
(')(.*?)(')
您可以分别在$1
,$2
,$3
中获取所捕获的文本。
请注意*?
是一个非贪婪的量词,简单的解释是:它不会随意消耗你的'
。