POSIX 字符 class 在基本 R 正则表达式中不起作用

POSIX character class does not work in base R regex

我在将模式与 R 中的文本字符串匹配时遇到一些问题。

当文本类似于 "lettersornumbersorspaces y lettersornumbersorspaces".

时,我正在尝试使用 grepl 获取 TRUE

我正在使用以下 regex:

([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+

当如下使用 regex 获得 "address" 时,它按预期工作。

regex <- "([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+"
address <- str_extract(fulltext, regex)

我看到地址是我需要的文本。现在,如果我想使用 grepl 得到一个 TRUE 如下:

grepl("([:alnum:]|[:blank:])+[:blank:][yY][:blank:]([:alnum:]|[:blank:])+", address,ignore.case = TRUE)

FALSE 返回。这怎么可能?我使用相同的 regex 来获得 TRUE。我尝试修改 grepl 参数,但没有一个与此相关。

文本示例为:"26 de Marzo y Pareyra de la Luz"

谢谢!!

尽管 stringr ICU 正则表达式引擎在模式中支持裸 POSIX 字符 类,但在基本 R 正则表达式风格中(PCRE(perl=TRUE) 和 TRE), POSIX 字符 类 必须在括号表达式 内。 [:alnum:] -> [[:alnum:]].

x <- c("AZaz09 y AZaz09", "ĄŻaz09 y AZŁł09", "26 de Marzo y Pareyra de la Luz")
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x)
## => [1] TRUE TRUE TRUE
grepl("[[:alnum:][:blank:]]+[[:blank:]][yY][[:blank:]][[:alnum:][:blank:]]+", x, perl=TRUE)
## => [1] TRUE TRUE TRUE

online demo

单独使用[:alnum:]时,是匹配单个字符的简单括号表达式,一个:aln, u, m.

图案详情:

  • [[:alnum:][:blank:]]+ - 1+ 个字母数字或水平空白符号
  • [[:blank:]] - 1 个水平空白符号
  • [yY] - yY
  • [[:blank:]] - 1 个水平空白符号
  • [[:alnum:][:blank:]]+ - 1+ 个字母数字或水平空白符号