在R中使用正则表达式进行问题匹配标点

布赖恩

我正在将数据转换为XML格式。XML约束之一是:

标记名称不能包含任何字符!“#$%&'()* +,/; <=>?@ [] ^`{|}〜也不可以是空格字符,并且不能以“-”,“ ”或数字。

我试图在创建标签之前捕获这些错误,并且在使用正则表达式来匹配包含任何这些字符的任何内容时遇到了麻烦。

我希望能够使用'[:punct:]',但由于允许使用一些标点符号,所以我不能。

我尝试过的正则表达式:

'[!"#$%&\'()*+,/;<=>?@[\\]^`\\{|\\}~ ]'

R代码:

practice <- c("T[K","T!K","T\"K","T#K","T$K","T%K","T&K","T'K","T(K",  "T)K","T*K","T+K","T,K","T/K","T;K","T<K","T=K","T>K","T?K","T@K",  "T[K","T\\K","T]K","T^K","T`K","T{K","T|K","T}K","T~K","T]K")

grepl(pattern = '[!"#$%&\'()*+,/;<=>?@[\\]^`\\{|\\}~]', practice)

我希望结果全部为TRUE。

实际结果:

[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[18] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

我假设我正在弄乱反斜杠转义的语法或对[]的理解。但是,我一直在进行研究,但仍然很难找出问题所在。任何帮助都会很棒。谢谢

你好

我认为您只需要更多的逃生通道即可。在这里,我转义了每个特殊的正则表达式字符,并对模式进行了重新排序,以使其与中的顺序相同practice请注意,您在中]出现过两次practice我删除了它,并添加了_和的示例,.因为您说的是允许的,我可以证明它们正确不匹配。

请记住,\在R字符串中进行转义,然后在正则表达式中也进行转义,因此您需要对\\正则表达式中的特殊字符进行转义。换句话说,所提供的字符串 \\$被视为模式 \$,这意味着文字 $而不是字符串的结尾。这也意味着您需要\\\\一个文字\...

practice <- c("T.K","T_K","T[K","T!K","T\"K","T#K","T$K","T%K","T&K","T'K","T(K",  "T)K","T*K","T+K","T,K","T/K","T;K","T<K","T=K","T>K","T?K","T@K","T[K","T\\K","T]K","T^K","T`K","T{K","T|K","T}K","T~K")

stringr::str_detect(practice, "[\\[\\!\"#\\$%&'\\(\\)\\*\\+,/;<=>\\?@\\[\\\\\\]\\^`\\{\\|\\}~]")
#>  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [23]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
grepl("[\\[\\!\"#\\$%&'\\(\\)\\*\\+,/;<=>\\?@\\[\\\\\\]\\^`\\{\\|\\}~]", practice, perl = TRUE)
#>  [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [12]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
#> [23]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

reprex软件包(v0.2.1)创建于2019-05-17

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章