匹配字符后跟恰好 1 位数字

Matching character followed by exactly 1 digit

我需要对齐一些临床试验 ID 的格式,将两个数据库合并。例如,在数据库 A 中,患者 123 就诊 1 存储为“123v01”,而在数据库 B 中仅存储为“123v1”

我可以通过 grep 匹配包含 'v0' 的那些匹配 A 到 B 并将尾随零去掉到 'v',但为了学术兴趣和扩展 R / regex 技能,我想通过仅匹配包含 'v' 后跟 1 个数字的那些来反向匹配 B 到 A,这样我就可以分别用前导零填充该数字。

对于代表:

string <- c("123v1", "123v01", "123v001")

我可以匹配那些在 'v' 之后有 >= 2 位的数字,然后是逆子集

> idx <- grepl("v(\d{2})", string)
> string[!idx]
[1] "123v1"

但必须有一种方法可以匹配 'v' 后跟一个数字吗?我试过环顾四周

# Negative look ahead "v not followed by 2+ digits"
grepl("v(?!\d{2})", string)

# Positive look behind "single digit following v"
grepl("(?<=v)\d{1})", string)

但是 return 和 'invalid regex' 错误

有什么建议吗?

您需要在 grepl 函数上设置 perl=TRUE 标志。

例如

grepl("v(?!\d{2})", string, perl=TRUE)
[1]  TRUE FALSE FALSE

有关详细信息,请参阅

您可以使用

grepl("v\d(?!\d)", string, perl=TRUE)

v\d(?!\d) 模式匹配 v, 1 位数字,然后确保当前位置右侧没有数字(即在 v + 1 位数字之后) .

参见regex demo

请注意,您需要使用 perl=TRUE 参数启用 PCRE 正则表达式风格。