用于特定和重复模式的正则表达式 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+)?)*$"
在 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)
模式是这样的:^{single_item_regex}(?:\|{single_item_regex})*$
。它匹配:
^
- 字符串开头
{single_item_regex}
- 单个项目的模式(请注意,我将 [[:digit:]]
替换为 \d
以使其更短,但如果您需要坚持使用 POSIX字符class,你可以)
(?:
- non-capturing 组的开始:
\|
- 一根烟斗
{single_item_regex}
- 单项模式
)*
- 组结束,重复0次或多次
$
- 字符串结尾。
在单项模式中,我建议用(?:\.\d+)?
替换\.{0,1}\d+
,因为这里的目的是匹配一个可选的.
和末尾的1+位数字。
要匹配 "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+)?)*$"
在 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)
模式是这样的:^{single_item_regex}(?:\|{single_item_regex})*$
。它匹配:
^
- 字符串开头{single_item_regex}
- 单个项目的模式(请注意,我将[[:digit:]]
替换为\d
以使其更短,但如果您需要坚持使用 POSIX字符class,你可以)(?:
- non-capturing 组的开始:\|
- 一根烟斗{single_item_regex}
- 单项模式
)*
- 组结束,重复0次或多次$
- 字符串结尾。
在单项模式中,我建议用(?:\.\d+)?
替换\.{0,1}\d+
,因为这里的目的是匹配一个可选的.
和末尾的1+位数字。