【发布时间】: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 = TRUE即sub("^[\\W_0-9]*([a-zA-Z]+).*", "\\1", x, perl = TRUE)在这里,我使用sub因为我们只匹配一次 -
@mt1022
perl=TRUE解决了这个问题。你能把它作为答案让我接受吗?谢谢。 -
添加
perl=TRUE不是一个完整的解决方案。您需要在正则表达式之前添加(?s),因为在 TRE 中,.匹配任何字符,而在 PCRE 中它匹配除换行符之外的任何字符。
标签: r regex square-bracket metacharacters