在用户定义的字符类中使用 \\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 时出现问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章