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

Regex grepl for specific and repeating pattern

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

grepl("^[[:alnum:]]+_[[:digit:]]+_[[:digit:]]+\.{0,1}[[:digit:]]+$", "lkas32kj_123_3.21")

我如何将其扩展到 | repeating/compound 字符串 任意长度 的情况,例如(长度三)"lkas32kj_123_3.21|l3kj_12_0.21|123e_4_32.1"。

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

您可以使用

"^[[: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字符class,你可以)
  • (?: - non-capturing 组的开始:
    • \| - 一根烟斗
    • {single_item_regex} - 单项模式
  • )* - 组结束,重复0次或多次
  • $ - 字符串结尾。

在单项模式中,我建议用(?:\.\d+)?替换\.{0,1}\d+,因为这里的目的是匹配一个可选的.和末尾的1+位数字。