我正致力于过滤和替换{{hello}
等破碎的大括号标签。我已经在Stack中尝试了一些正则表达式,并且我自己尝试了。我的关闭是使用这个正则表达式
(?=(\}(?!\})))((?<!\})\})
选择下面示例代码块中的最后一个标记。但是它不会选择整个标记,而只选择结束的大括号}
。
{{hello}}
{{world}}}
{{foobar}}
{{hello}
我需要做的是选择任何缺少第二个结束大括号的标签,例如{{hello}
。任何人都可以帮我正则表达式选择这种类型的标签吗?
答案 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)
我建议使用以下表达式:
/(?<!{){{[^{}]+}(?!})/
该模式将匹配以{{
开头但未加{
的任何文字字符串,后跟{{1}以外的任何1个字符}和{
以及未跟随}
的}
。因此,此模式匹配完全}
结构的字符串。
这是Ruby demo:
{{xxx}
模式详情:
"{{hello}".gsub(/(?<!{){{[^{}]+}(?!})/, "\\0}")
# => {{hello}}
- 如果(?<!{)
出现在当前位置的左侧,则会出现负面的背后失败{
- 文字{{
{{
- 除[^{}]+
和{
以外的1个以上字符(要允许空值,请使用}
代替*
)+
- 结束单}
}
- 如果(?!})
出现在之前匹配的}
之后,则会出现否定前瞻功能。