使用正则表达式替换字符之间的可选匹配项

时间:2014-06-25 00:39:56

标签: ruby-on-rails regex

我尝试将html实体替换为空格,并在{{和}}

出现之间留出实际空格

示例示例

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

我找到了类似的答案,这些答案让我写了这样的东西(它不起作用)

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

对此类正则表达式的任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分: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 }}"

答案 1 :(得分:0)

使用\K\G

单次调用gsub

这有点棘手,但在Ruby 2.0+中,由于\K\G令牌,我们可以使用紧凑的正则表达式来完成它。使用此正则表达式并替换为空格:

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

请参阅demo

在Ruby中:

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

<强>解释

  • [^{}]*匹配任何非大括号的字符
  • \K告诉引擎放弃匹配的内容
  • (?:{{|\G)要么与开场曲线相匹配,要么断言我们在最后一场比赛后定位
  • .*?\K懒惰地匹配字符(并删除它们),最多......
  • &nbsp;我们的比赛!
  • ,就像外观(?=[^{]*})所断言的那样,在遇到一个大括号之前,必须跟着任何不是开口大括号的字符