闭括号的递归正则表达式

时间:2017-08-17 17:49:55

标签: ruby regex

我试图将ruby中的正则表达式编写为符合以下条件的模式

/{{\d+}}/双花括号,里面有一个数字

/.*{{\d+}}.*/它可以在任意数量的字符之前或之后

/.*{{\d+}}.*\m/它可以是多行

直到这部分它正在运作

它接受像" afaf {{}} {{" ,所以我做了更改

/(?:(.*\{\{\d+\}\}.*)\g<1>\m)/可以有多个*{{number}}*

例如

empty string

xyz

{{345345}}

any thing{{234234324}}

<abc>{{234234}}<-

any chars{{234}}
{{234234}}any chars
{{4}}

无效的

{{non intgers}}

{{5345345}}{{

}}3345345{{

{345345}

{{34534}
}

4545

{234234

{{
5345
}}

但它没有按预期工作。

2 个答案:

答案 0 :(得分:1)

这里似乎不需要递归,只需使用分组构造否定字符类以确保不匹配不允许的字符:

rx = /\A(?:[^\d{}]*{{\d+}})*[^\d{}]*\z/

<强>详情

  • \A - 字符串开头
  • (?:[^\d{}]*{{\d+}})* - 零个或多个序列:
    • [^\d{}]* - 除了数字{}之外的任何0个或多个字符
    • {{\d+}} - {{,1位数,}}
  • [^\d{}]* - 除了数字{}之外的任何0个或多个字符
  • \z - 字符串结束。

请参阅Ruby demo test

rx = /\A(?:[^\d{}]*{{\d+}})*[^\d{}]*\z/
ss = ['', 'xyz', '{{345345}}','any thing{{234234324}}','<abc>{{234234}}<-',"any chars{{234}}\n{{234234}}any chars\n{{4}}\n" ]
puts "Valid:"
for s in ss
    puts "#{s} => #{(s =~ rx) != nil}"
end

nonss = ['{{non intgers}}','{{5345345}}{{','}}3345345{{','{345345}',"{{34534}\n}", '4545', '{234234', "{{\n5345\n}}" ]
puts "Invalid:"
for s in nonss
    puts "#{s} => #{(s =~ rx) != nil}"
end

输出:

Valid:
 => true
xyz => true
{{345345}} => true
any thing{{234234324}} => true
<abc>{{234234}}<- => true
any chars{{234}}
{{234234}}any chars
{{4}}
 => true
Invalid:
{{non intgers}} => false
{{5345345}}{{ => false
}}3345345{{ => false
{345345} => false
{{34534}
} => false
4545 => false
{234234 => false
{{
5345
}} => false

答案 1 :(得分:0)

试试这个:

(?m)^(?:(?:.+)?(?:{{)(?<NUM>\d+)(?:}})(?:.+)?)$

https://regex101.com/r/WIuDhw/1/

进行测试