2014-06-25 100 views
2

我试图用{{和}}使用正则表达式替换charaters

例例如

"this is a     gap {{  for user in users }}" => 
"this is a     gap {{ for user in users }}" 

我的出现之间的实际空间,以取代HTML实体空格之间可选的比赛“已经发现了类似的答案,从而促使我写这样的事情(不工作)

.gsub(/(?<=\{\{).*(&nbsp;?).*(?=\}\})/,' ') 

这样的正则表达式的任何帮助,将不胜感激感谢!

+0

你只想在{{大括号}}之间进行替换,对吧? – zx81

+0

只用{{}} – Dandan

回答

0

单呼到GSUB使用\K\G

这是一个有点棘手,但在Ruby中2.0+,我们可以用正则表达式紧凑多亏了\K\G令牌做到这一点。使用此正则表达式,并用空格代替:

[^{}]*\K(?:{{|\G).*?\K&nbsp;(?=[^{]*}) 

demo

在Ruby:

result = subject.gsub(/[^{}]*\K(?:{{|\G).*?\K&nbsp;(?=[^{]*})/, ' ') 

说明

  • [^{}]*比赛未牙套
  • \K告诉引擎砸什么只是匹配
  • (?:{{|\G)或匹配任何字符开幕式表明我们是定位在最后一场比赛后
  • .*?\K懒洋洋地匹配字符(并将它们丢弃),最多可以输入
  • &nbsp;我们的比赛!
  • 其中,作为lookakead (?=[^{]*})断言,必须跟那些不开括号满足一个右括号前
2

你可以用一个复杂的正则表达式我同意这样做,但我觉得它的任何字符更易于使用嵌套替代。首先使用gsub查找括号内的子字符串,然后使用另一个替换实体。

string = 'this is a &nbsp;&nbsp;&nbsp; gap {{ &nbsp;for user in&nbsp;users&nbsp;}}' 
result = string.gsub(/{{.*?}}/){ |s| s.gsub(/&nbsp;/, ' ') } 
# => "this is a &nbsp;&nbsp;&nbsp; gap {{ for user in users }}" 
+0

之间的空格替换' '为了向他阐明,此解决方案(其工作原理)链接了两个连续的替换操作。 – zx81