如何创建一个正则表达式来匹配最里面的匹配项或从右到左工作?
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)
目前您反复说双引号或单引号。您想匹配第一个引用的任何类型。
你可能实际上应该在 svg 之前转义 .
所以它是文字并检查第一个 .svg
.
("|')(.*?\.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'。
我正在尝试匹配图像引用的字符串,但是当涉及到表达式时,我发现有点太多了。在这个例子中 http://www.regexr.com/3b3ub,你会看到我在第 1 场和第 3 场比赛中表现不错,但我在第 2 场比赛中表现得太多了。我只想要 'images/md-icons/ic_notifications_24px.svg'
但实际上我也得到了 "{{ vm.actions.length ?
。
我可以使用一些否定或限定符来实现非贪婪的最内层匹配吗?
您应该匹配相同的引号。
("|')(.*.svg)
目前您反复说双引号或单引号。您想匹配第一个引用的任何类型。
你可能实际上应该在 svg 之前转义 .
所以它是文字并检查第一个 .svg
.
("|')(.*?\.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'。