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

时间:2019-08-19 15:04:59

标签: r regex regex-lookarounds

我需要将两个合并两个数据库的某些临床试验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)

但是两者都返回“无效的正则表达式”错误

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

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

例如

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

有关更多信息,请参见this question

答案 1 :(得分:1)

您可以使用

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

v\d(?!\d)模式与v匹配1位数字,然后确保当前位置的右边没有数字(即v + 1位数字之后)。 / p>

请参见regex demo

请注意,您需要使用perl=TRUE参数启用PCRE regex风格。