查找相距 0 到 3 个单词的两个关键字

JBG*_*ber 5 regex r

我想识别包含两个关键字且之间有 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+)不让句子包含任何标点符号。如何更好地定义单词的正则表达式,以便不排除标点符号(最好是忽略它)。

Wik*_*żew 3

您可以使用

> 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+),然后匹配一个或多个非单词字符。