我试图将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
}}
但它没有按预期工作。
答案 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)