【问题标题】:Javascript regexp non greedy search for quotesJavascript正则表达式非贪婪搜索引号
【发布时间】:2015-11-24 15:23:03
【问题描述】:

我有以下文字:

<a href="{{'Čeština' | l10n}}" ng-click="setLocale('cs_CZ')">{{field.text || 'Čeština' | l10n}}</a>

正则表达式: /((?!l10n))*?(['"])(.*?)\2[\s]*?\|[\s]*?l10n/g

我正在尝试用修改后的字符串替换 l10n 之前的字符串。我的正则表达式工作正常,除了这种情况,它从setLocale 函数中吃掉'

这是带有我的表达式的交互式正则表达式测试器 - https://regex101.com/r/vX5tJ6/3

问题是,为什么它在 setLocale 之后没有 |(如 regexp 中所指定)时会吃掉来自 setLocale 的 '

【问题讨论】:

标签: javascript regex regex-greedy non-greedy


【解决方案1】:

也许这就是你要找的东西:

(['"])([^'"]*)\1\s*\|\s*l10n

https://regex101.com/r/lV8wV7/1

它查找单引号或双引号后跟| l10n 和可选空格的任何内容。

您的正则表达式匹配单引号或双引号,后跟任何字符,非贪婪,然后是另一个匹配的引号。但是,它能够非贪婪地匹配封闭的引号(因此不仅仅是它遇到的最后一个令人满意的引号),而不会违反模式的其余部分。

上述模式的主要区别在于它不允许使用引号。

如果需要允许双引号括在单引号中或双引号中的单引号,可以尝试如下:

(?:(')([^']*)'|(")([^"]*)")\s*\|\s*l10n

https://regex101.com/r/mL8gA6/1

【讨论】:

  • 谢谢,差不多了 :) 再有一个问题,只有一次替换字符串的发生 - regex101.com/r/vX5tJ6/5 这就是为什么我在我的正则表达式中有 (?!l10n)
  • 第一个版本对我来说风险太大,允许' 匹配",反之亦然。
  • @Pirozek - 我没有看到一次出现的问题?如果模式同时出现在 href 属性和文本中,您是否只想匹配?
  • @dustmouse 是的,抱歉,第二个正则表达式的工作原理非常棒,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 2010-10-20
  • 2013-02-15
  • 1970-01-01
相关资源
最近更新 更多