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

时间:2015-08-30 17:09:04

标签: java regex

我有一个正则表达式来提取两个标记,分隔符[']和撇号之间的单词,如“ Stack Overflow ”。问题是,为什么这个正则表达式不起作用?

正则表达式:

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

这是一个解释它的链接: Regular Expression

仅用于提取撇号,但是在撇号之间的单词

注意:我需要像'Stack Overflow'一样单独提取撇号和撇号之间的任何单词。

结果如下:

  1. Stack Overflow
  2. 问候。

2 个答案:

答案 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中获取所捕获的文本。

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