在用户定义的字符类中使用 \\d 时出现问题 [重复]

Posted

技术标签:

【中文标题】在用户定义的字符类中使用 \\\\d 时出现问题 [重复]【英文标题】:Problem using \\d inside a user-defined character class [duplicate]在用户定义的字符类中使用 \\d 时出现问题 [重复] 【发布时间】:2022-01-15 07:43:52 【问题描述】:

我很难理解为什么我似乎无法在[] 之间包含诸如\\d\\w 之类的速记字符类在用户定义的字符类中 (尽管我见过可以进行这种包含的情况)。在这个说明性示例中,我想做的是将货币符号从字符串的右端重新定位到字符串的开头:

a_1 <- c("155.88¥","5156.04€","656","1566.1$")

sub("([\\w.]+)([€$¥])", "\\2\\1", a_1)   # doesn't work
sub("([\\d.]+)([€$¥])", "\\2\\1", a_1)   # doesn't work
sub("([0-9.]+)([€$¥])", "\\2\\1", a_1)   # works

为什么只有完全用户定义的字符类起作用,而涉及速记字符类的不起作用?

预期结果:

[1] "¥155.88"  "€5156.04" "656"      "$1566.1"

【问题讨论】:

字符类\\w\\s\\d等来自perl,所以当你使用这些字符类时,请确保在你的代码中添加perl = T:) 啊,是的!这就是解决方案!谢谢你的澄清。请考虑将此作为答案发布,以便我接受! 【参考方案1】:

这是 R 的正则表达式风格的一个特征,即 POSIX。 See here POSIX 不允许在字符类中使用 \d,而是必须使用 [0-9][[:digit:]]。根据documentation:

您可以在 [] 中使用许多预构建的类:

[:punct:]: punctuation.
[:alpha:]: letters.
[:lower:]: lowercase letters.
[:upper:]: upperclass letters.
[:digit:]: digits.
... (and others)

考虑:

a_1 <- c("155.88¥","5156.04€","656","1566.1$")
sub("([[:digit:].]+)([€$¥])", "\\2\\1", a_1)

[1] "¥155.88" "€5156.04" "656" "$1566.1"

但请注意,如果我们在 Perl 模式下运行 sub(即 PCRA 正则表达式),则字符类中的 \d 可以工作:

a_1 <- c("155.88¥","5156.04€","656","1566.1$")
sub("([\\d.]+)([€$¥])", "\\2\\1", a_1, perl=TRUE)

[1] "¥155.88" "€5156.04" "656" "$1566.1"

也许您记得在字符类中看到\d 的地方是使用 Perl PCRA 模式。

【讨论】:

R 中只有这些吗?我在 [] 中看到了 \\w\\s @ChrisRuehlemann 是的,还有许多其他预定义的字符类,请查看我答案中的链接。您的问题的答案是 R 的正则表达式风格是这样的。 我检查了链接,我知道有很多预定义的 char 类。该链接没有明确说明,例如,\\d 不能在 [] 内使用。重申一下,我已经在 R 中看到了可以完成的案例,至少在 \\s\\w【参考方案2】:

根据要求:

\\d\\s\\w 等字符类来自 Perl,因此在使用这些类时,请确保在代码中添加 perl = T

例如:

sub("([\\w.]+)([€$¥])", "\\2\\1", a_1, perl = T) 

更多信息可以在这里找到:

https://perldoc.perl.org/perlrecharclass

【讨论】:

以上是关于在用户定义的字符类中使用 \\d 时出现问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用基类中定义的函数返回指向派生类实例的指针时出现无效转换错误

keil 4.22 MDK 建工程时出现的重定义错误

在bash脚本中重定向到文件时出现奇怪的字符[重复]

尝试从部分视图重定向用户时出现CORS错误

在 R 中运行简单的“重命名”函数时出现错误消息

从 servlet 重定向到 html 时出现 404 错误