Javascript “的高效正则表达式”;环绕;像{{……}这样的情况

Javascript “的高效正则表达式”;环绕;像{{……}这样的情况,javascript,regex,Javascript,Regex,我想获取由一些定制的“括号”包围的文本,即:{{…}或@(…)@ 当括号仅为一个字符长度(即:{..})时,它是: /{(.*?)}/g 还有一种更有效的解决方案,使用“非端括号”模式: 但对于两个characsters括号,只有这个有效 /{{(.*?)}}/g 我找不到一个有效的解决方案,就像在一个字符的情况下一样 有吗?我想你不必担心筑巢的问题。如果你这样做,你就不应该使用正则表达式 这里有一种不使用非贪婪匹配的方法(*?): 英文: 两个花括号 一些: 不卷曲的大括号 或者一个大

我想获取由一些定制的“括号”包围的文本,即:{{…}或@(…)@

当括号仅为一个字符长度(即:{..})时,它是:

/{(.*?)}/g
还有一种更有效的解决方案,使用“非端括号”模式:

但对于两个characsters括号,只有这个有效

/{{(.*?)}}/g
我找不到一个有效的解决方案,就像在一个字符的情况下一样


有吗?

我想你不必担心筑巢的问题。如果你这样做,你就不应该使用正则表达式

这里有一种不使用非贪婪匹配的方法(
*?
):

英文:

  • 两个花括号
  • 一些:
    • 不卷曲的大括号
    • 或者一个大括号后面跟着一个非大括号
  • 和两个紧密的花括号
这通过n个独立的分支推广到n个花括号,一个用于非花括号,一个用于一个花括号和一个非花括号,一个用于两个花括号和一个非花括号,等等

在你的特殊情况下,你可以写:

/{{(}?[^}])*}}/g
顺便说一句:团队可能不需要捕获。例如:

/{{(?:}?[^}])*}}/g

我想你不必担心筑巢。如果你这样做,你就不应该使用正则表达式

这里有一种不使用非贪婪匹配的方法(
*?
):

英文:

  • 两个花括号
  • 一些:
    • 不卷曲的大括号
    • 或者一个大括号后面跟着一个非大括号
  • 和两个紧密的花括号
这通过n个独立的分支推广到n个花括号,一个用于非花括号,一个用于一个花括号和一个非花括号,一个用于两个花括号和一个非花括号,等等

在你的特殊情况下,你可以写:

/{{(}?[^}])*}}/g
顺便说一句:团队可能不需要捕获。例如:

/{{(?:}?[^}])*}}/g

假设你有{{…}

var subject= "{{i am legend}}";
var pattern = /(?:{{)([\w\W]*)(?:}})/;
var text= subject.match(pattern)[1];

您可能需要包括转义,这取决于您选择的“括号”

假设您有{{…}

var subject= "{{i am legend}}";
var pattern = /(?:{{)([\w\W]*)(?:}})/;
var text= subject.match(pattern)[1];

您可能需要包括转义,具体取决于您选择的“括号”

如果您有{{nested{{brands}}}?}}当前我不需要嵌套括号,会发生什么情况。我只需要括号的级别,一个{..}表示变量,一个@{..}@表示内部的js代码。这是一个简单的模板。如果你有{{嵌套的{{括号}}?}}怎么办?目前我不需要嵌套的括号。我只需要括号的级别,一个{..}表示变量,一个@{..}@表示内部的js代码。这是一个简单的模板。谢谢!这使我免于很多头痛:)我以前不知道(?:)。谢谢:)@Lawrence:使用模式进行嵌套分隔符是很简单的,如中所示。您也不能用DFA解决
(.+)\1
,但这并没有阻止任何人在正则表达式中使用它。真正的问题是Javascript的模式过于原始。更糟糕的是,您无法在Javascript中进行正确的(根据UTS 18)Unicode模式匹配,因为这是Unicode模式匹配中最差的。甚至PHP也更好。我会在第一个选项中添加一个
+
/{{([^}]+}[^}])*}/
。将其应用于字符串
{{stuff}}
,RegexBuddy说匹配需要9个步骤;如果没有
+
,它需要17个步骤。@tchrist,我知道在某些语言中可以使用非正则的“regex”[sic]模式进行嵌套,但您会注意到我说的是“正则表达式”,而不是“模式”(以及“不应该”,而不是“不能”),因此,可以使用非正则模式进行嵌套的事实是无关的。是的,我同意JavaScript的正则表达式支持非常糟糕,但这正是OP所要求的。我相信,如果浏览器脚本有一个可行的开放替代方案,几乎没有人会使用JavaScript,但事实上,人们不得不忍受它,而且改进的压力很小。谢谢!这使我免于很多头痛:)我以前不知道(?:)。谢谢:)@Lawrence:使用模式进行嵌套分隔符是很简单的,如中所示。您也不能用DFA解决
(.+)\1
,但这并没有阻止任何人在正则表达式中使用它。真正的问题是Javascript的模式过于原始。更糟糕的是,您无法在Javascript中进行正确的(根据UTS 18)Unicode模式匹配,因为这是Unicode模式匹配中最差的。甚至PHP也更好。我会在第一个选项中添加一个
+
/{{([^}]+}[^}])*}/
。将其应用于字符串
{{stuff}}
,RegexBuddy说匹配需要9个步骤;如果没有
+
,它需要17个步骤。@tchrist,我知道在某些语言中可以使用非正则的“regex”[sic]模式进行嵌套,但您会注意到我说的是“正则表达式”,而不是“模式”(以及“不应该”,而不是“不能”),因此,可以使用非正则模式进行嵌套的事实是无关的。是的,我同意JavaScript的正则表达式支持非常糟糕,但这正是OP所要求的。我相信,如果浏览器脚本有一个可行的开放替代方案,几乎没有人会使用JavaScript,但事实上,人们不得不忍受它,而且它没有什么改进的压力。在大多数情况下,这将比OP开始时的效率要低得多。这也是不正确的,因为它将
{{abc}}def{{{ghi}}
视为一个匹配项。在大多数情况下,这将比OP开始时的效率低得多。它也不正确,因为它将
{{abc}}def{{{ghi}}
视为一个匹配项。