如何创建一个正则表达式来匹配最里面的匹配项或从右到左工作?

How can I create a regex to match the inner-most match or work from right-to-left?

我正在尝试匹配图像引用的字符串,但是当涉及到表达式时,我发现有点太多了。在这个例子中 http://www.regexr.com/3b3ub,你会看到我在第 1 场和第 3 场比赛中表现不错,但我在第 2 场比赛中表现得太多了。我只想要 'images/md-icons/ic_notifications_24px.svg' 但实际上我也得到了 "{{ vm.actions.length ?

我可以使用一些否定或限定符来实现非贪婪的最内层匹配吗?

您应该匹配相同的引号。

("|')(.*.svg)

http://regexr.com/3b3uh

目前您反复说双引号或单引号。您想匹配第一个引用的任何类型。

你可能实际上应该在 svg 之前转义 . 所以它是文字并检查第一个 .svg.

http://regexr.com/3b3uk

("|')(.*?\.svg)

是一个反向引用,它指的是第一个捕获的组(双引号或单引号)。 http://www.regular-expressions.info/backref.html

这里发生了一些事情:

  • 正如@chris85 指出的那样,您想要匹配 类型的与开场报价相对应的收场报价。 Chris 的示例是 ("|'),它绝对有效——但是你的 ["'] 的原始示例也可以正常工作,只要你将它放在括号 (["']) 中,所以 </code>文末可以参考。</li> <li>您的问题专门询问了 "non-greedy" 修饰符。正则表达式项是 "lazy",它绝对存在:<code>?。把它放在 .*.
  • 之后
  • .* 中的星号匹配零次或多次——但我认为您永远不会想找到一个长度为零的示例(它只是“.svg").这是个人喜好问题,但我建议将其更改为 +(匹配一次或多次)。
  • 在您的示例正则表达式中,字符“.svg”中的点没有找到文字点,而是 any 字符(所以“xsvg”也是一个匹配项)。您需要使用反斜杠将其转义以使其成为文字点:\.svg.

你想要的正则表达式是:(["'])(.*?\.svg)

这是 link:http://www.regexr.com/3b3uq

更新

我看到在我打字时,Chris 进行了一些编辑,涵盖了我所涵盖的相同领域。我赞成这个答案。

您可以使用

隔离您想要的信息
["'](images\S+.svg)['"] 

["'](\S+.svg)['"]

第一个解决方案着眼于 'images\anything-but-a-non-whitespace.svg',而第二个解决方案着眼于 'anything-but-a-non-whitespace.svg'。