要匹配我使用(在R中)格式为“ lkas32kj_123_3.21”的字符串
|
我该如何将此扩展到具有{strong>任何长度的wrod Wrap
重复/复合字符串的情况,例如(长度三)“ lkas32kj_123_3.21 | l3kj_12_0.21 | 123e_4_32.1”。
有没有办法制作嵌套(递归?)模式?
答案 0 :(得分:2)
您可以使用
"^[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?(?:\\|[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?)*$"
请参见regex demo
在R中,使用
x <- c("lkas32kj_123_3.21", "lkas32kj_123_3.21|l3kj_12_0.21|123e_4_32.1", "+++NO+++")
rx <- "[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?"
grepl(paste0("^", rx, "(?:\\|", rx ,")*$"), x)
请参见R demo online。
模式如下:^{single_item_regex}(?:\|{single_item_regex})*$
。符合条件:
^
-字符串的开头{single_item_regex}
-单个项目的模式(请注意,我将[[:digit:]]
替换为\d
以使其更短,但是如果需要坚持使用POSIX字符类,则可以可能)(?:
-一个非捕获组的开始:
\|
-管道{single_item_regex}
-单项模式)*
-组结束,重复0次或更多次$
-字符串的结尾。在单项模式中,我建议将\.{0,1}\d+
替换为(?:\.\d+)?
,因为这里的目的是在末尾匹配可选的.
和1+数字。