我想识别包含两个关键字且之间有 0 到 3 个单词的字符串。我所拥有的在大多数情况下都有效:
strings <- c(
"Today is my birthday",
"Today is not yet my birthday",
"Today birthday",
"Today maybe?",
"Today: birthday"
)
grepl("Today(\\s\\w+){0,3}\\sbirthday", strings, ignore.case = TRUE)
#> [1] TRUE FALSE TRUE FALSE FALSE
Run Code Online (Sandbox Code Playgroud)
由reprex 包于 2021 年 11 月 24 日创建(v2.0.1)
我的问题是字符串"Today: birthday"。问题在于,单词被定义为(\\s\\w+)不让句子包含任何标点符号。如何更好地定义单词的正则表达式,以便不排除标点符号(最好是忽略它)。
您可以使用
> grepl("Today(\\W+\\w+){0,3}\\W+birthday", strings, ignore.case = TRUE)
[1] TRUE FALSE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
另外,请考虑使用字边界、非捕获组和更稳定的 PCRE 正则表达式引擎:
grepl("\\bToday(?:\\W+\\w+){0,3}\\W+birthday\\b", strings, ignore.case = TRUE, perl=TRUE)
Run Code Online (Sandbox Code Playgroud)
该(?:\W+\w+){0,3}\W+部分匹配零到三次出现的一个或多个非单词字符 ( \W+),然后匹配一个或多个单词字符 ( \w+),然后匹配一个或多个非单词字符。