为什么这个正则表达式不起作用?

6
我有一个正则表达式,可以提取两个标记,分隔符 ['] 和在撇号中间的单词,比如 'Stack Overflow'。问题是,为什么这个正则表达式不起作用呢?
正则表达式:
(['])|'([^']*)'

这里有一个解释链接: 正则表达式 只能提取撇号,但不能提取撇号之间的单词。
注意:我需要分别提取撇号和撇号之间的任何单词,例如 'Stack Overflow'。
结果将会是:
  1. '
  2. Stack Overflow
  3. '
问候。

1
@JesúsA.MezaG. 如果那个链接失效了,未来的读者怎么知道这个问题是关于什么的?最好直接在问题中包含相关部分。 - Eric Renouf
2
好的,已编辑完毕,谢谢。 - user5237181
2个回答

5

您的正则表达式要么匹配单引号,要么匹配引号之间的内容,但是它是互斥或的方式。为了以捕获组的形式获取它们中的每一个,您可以使用以下正则表达式:

(')([^']*)(')

获取第一个引号,然后获取除引号外的所有内容,最后获取最后一个引号。


4
由于存在短路逻辑,因此它才会short-circuit
在“或”条件中,一旦第一个正则表达式匹配成功,就没有必要再评估第二个正则表达式了。因为“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中获取捕获的文本。

请注意,*?是一个非贪婪量词,简单来说:它不会随意消耗您的'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接