正则表达式grepl用于特定和重复的模式

时间:2019-07-03 10:08:18

标签: r regex repeat grepl

要匹配我使用(在R中)格式为“ lkas32kj_123_3.21”的字符串

|

我该如何将此扩展到具有{strong>任何长度的wrod Wrap重复/复合字符串的情况,例如(长度三)“ lkas32kj_123_3.21 | l3kj_12_0.21 | 123e_4_32.1”。

有没有办法制作嵌套(递归?)模式?

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+数字。