正则表达式选择花括号,Ruby之间的文本

时间:2016-05-09 22:01:05

标签: ruby regex

我正致力于过滤和替换{{hello}等破碎的大括号标签。我已经在Stack中尝试了一些正则表达式,并且我自己尝试了。我的关闭是使用这个正则表达式 (?=(\}(?!\})))((?<!\})\})选择下面示例代码块中的最后一个标记。但是它不会选择整个标记,而只选择结束的大括号}

{{hello}}
{{world}}}
{{foobar}}
{{hello}

我需要做的是选择任何缺少第二个结束大括号的标签,例如{{hello}。任何人都可以帮我正则表达式选择这种类型的标签吗?

3 个答案:

答案 0 :(得分:1)

  

过滤并替换破损的大括号标签

如果您没有嵌套,这个问题很容易解决。

试试这个:

[\{]+([^}]+)[}]+

基本上,你可以用{{\1}}(或{{$1}}替换匹配,我忘记Ruby使用哪一个。)

只要在比赛中连续有{}中的一个或多个,它就会有效。

答案 1 :(得分:1)

我假设我们得到一个字符串,其中包含以&#34; {{&#34;,后跟&#34;标记&#34;开头的子字符串,这是&#34;以外的字符串; { &#34;和&#34;}&#34;,然后是&#34;}&#34;或&#34;}}&#34;。我们希望返回只有一个右括号的标签。例如:

str = "Sue said {{hello}}, Bob said {{world}\nTom said {{foobar}}, Lola said {{hello}"

我们可以使用以下正则表达式:

r = /
    \{\{        # match {{
    ([^}]+)     # match one or more characters other than } in capture group 1
    \}          # match }
    (?:\z|[^}]) # match end of line or a character other than }
                # in a non-capture group        
    /x          # free-spacing regex definition mode

str.scan(r).flatten
  #=> ["world", "hello"]

正则表达式当然可以用传统方式编写:

r = /\{\{([^}]+)\}(?:\z|[^}])/

请注意

str.scan(r)
  => [["world"], ["hello"]] 

因此需要flatten

请参阅String#scan以获取解释。

显然,如果

,同样的正则表达式
str = "{{hello}}\n{{world}\n{{foobar}}\n{{hello}"

str.scan(r).flatten
  #> ["world", "hello"]

如果

words = %w| {{hello}} {{world} {{foobar}} {{hello} |
  #=> ["{{hello}}", "{{world}", "{{foobar}}", "{{hello}"]

然后

words.select { |w| w =~ r }.map { |w| w[/[^{}]+/] } 
  => ["world", "hello"] 

答案 2 :(得分:1)

我建议使用以下表达式:

/(?<!{){{[^{}]+}(?!})/

请参阅regex101 demo

该模式将匹配{{ 开头但未加{ 的任何文字字符串,后跟{{1}以外的任何1个字符}和{以及未跟随} }。因此,此模式匹配完全}结构的字符串。

这是Ruby demo

{{xxx}

模式详情

  • "{{hello}".gsub(/(?<!{){{[^{}]+}(?!})/, "\\0}") # => {{hello}} - 如果(?<!{)出现在当前位置的左侧,则会出现负面的背后失败
  • { - 文字{{
  • {{ - 除[^{}]+{以外的1个以上字符(要允许空值,请使用}代替*
  • + - 结束单}
  • } - 如果(?!})出现在之前匹配的}之后,则会出现否定前瞻功能。