【问题标题】:R - regex: W metacharacter not working when within square brackets [duplicate]R - 正则表达式:W 元字符在方括号内不起作用[重复]
【发布时间】:2019-03-03 11:43:34
【问题描述】:

让我们使用以下字符串:

x <- " hello world"

我想提取第一个单词。为此,我使用以下正则表达式 ^\\W*([a-zA-Z]+).* 并反向引用第一组。

> gsub("^\\W*([a-zA-Z]+).*", "\\1", x)
[1] "hello"

它按预期工作。

现在,让我们在字符串中添加一个数字和下划线:

x <- " 0_hello world"

我将\\W 替换为[\\W_0-9] 以匹配新字符。

> gsub("^[\\W_0-9]*([a-zA-Z]+).*", "\\1", x)
[1] " 0_hello world"

现在,它不起作用,我不明白为什么。将\\W 放入[] 时似乎出现了问题,但我不知道为什么。 不过,正则表达式适用于 online regex tester using PCRE

我做错了什么?

【问题讨论】:

  • 试试sub("^[ 0-9]*([a-zA-Z]+).*", "\\1", x,)
  • @akrun,我使用 W 元字符而不是简单空格的原因是因为我正在处理许多以各种字符开头的字符串,包括标点符号、空格、数字和下划线。
  • 使用perl = TRUEsub("^[\\W_0-9]*([a-zA-Z]+).*", "\\1", x, perl = TRUE) 在这里,我使用sub 因为我们只匹配一次
  • @mt1022 perl=TRUE 解决了这个问题。你能把它作为答案让我接受吗?谢谢。
  • 添加 perl=TRUE 不是一个完整的解决方案。您需要在正则表达式之前添加(?s),因为在 TRE 中,. 匹配任何字符,而在 PCRE 中它匹配除换行符之外的任何字符。

标签: r regex square-bracket metacharacters


【解决方案1】:

快速的解决方案是通过添加额外的参数perl = TRUE 来使用类似 Perl 的正则表达式。

默认情况下,grep 使用扩展正则表达式(请参阅?regex),其中字符类以[:xxx:] 的格式定义。但是,我找不到与 \W 完全匹配的字符类。

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多