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

时间:2019-05-17 17:44:48

标签: r regex xml pattern-matching grepl

我正在将数据转换为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

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

1 个答案:

答案 0 :(得分:1)

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

请记住,\在R字符串中转义,然后在正则表达式中也转义,因此您需要\\在正则表达式中转义特殊字符。换句话说,提供的 string \\$被视为 pattern \$,表示 literal {{1 }}而不是字符串的结尾。这也意味着您需要$来获取文字\\\\ ...

\

reprex package(v0.2.1)于2019-05-17创建