2011-08-25 43 views
0

我想要获取由一些自定义“括号”包围的文本,即:{{...}}或@(...)@高效正则表达式适用于“环绕”状况,如{{....}}

当括号中只有一个字符的长度(即:{..}),它是:

/{(.*?)}/g 

并有一个更有效的解决方案,采用“未端托架”图案:

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

但是对于双字符括号,只有这个作品

/{{(.*?)}}/g 

我无法找到一个有效的解决方案,就像一个字符的情况。

有没有?

+1

如果有,会发生什么逃逸{{嵌套{{括号}}? }} –

+0

目前我不需要嵌套括号。我只需要括号中的水平,一个表示变量的{..}和一个表示内部js代码的@ {..} @。这是一个简单的模板。 –

回答

3

我假设你不需要担心嵌套。如果你愿意,你不应该使用正则表达式。

这里有一种方法做你想要什么,而无需使用非贪婪匹配(*?):

/{{([^}]|}[^}])*}}/g 

英文:

  • 两个花括号
  • 一些数量:
    • 一个非花括号
    • 或一个花括号followe d由非大括号
  • 和两个接近的大括号

这通过具有n个单独的分支,一个用于非卷曲,一个用于卷曲并概括出到n-大括号非卷曲,一个两个花括号和非卷曲等

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

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

BTW:该组可能不需要被捕获。例如:

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

谢谢!这使我从很多头痛中救了我:) –

+0

我以前不知道(?:)。谢谢:) –

+1

@劳伦斯:这是微不足道的使用模式嵌套分隔符,如[这个答案](http://stackoverflow.com/questions/4031112/regular-expression-matching/4034386#4034386)所示。你无法用DFA解决'(。+)\ 1',但这并没有阻止任何人在正则表​​达式中使用它。真正的问题是Javascript的模式太原始了。更糟糕的是,你无法在Javascript中使用Unicode模式匹配(每UTS#18),因为它是** [所有被调查语言中排名第一的最差的**](http://training.perl.com/ OSCON2011/index.html)用于Unicode模式匹配。即使PHP更好。 – tchrist

1

假设你有{{...}}

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

您可能需要包括取决于哪个 “括号” 你选择

+0

在大多数情况下,这比OP开始时效率要低很多*。这也是不正确的,因为它会将'{{abc}} def {{ghi}}'视为一场比赛。 –

相关问题