首页 > 解决方案 > 为什么 R 中的正则表达式搜索查询由字符串表示?

问题描述

为什么正则表达式模式必须由 R 中的字符串(或者,更具体地说,stringr)表示?

这个问题不是关于为什么我必须转义一个点来匹配一个正则表达式的文字点,而是为什么我必须两次将它排除,因为它在 R 中被写为一个字符串。

例如,如果我想将字符串 "ab" 转换为 "a,b",我需要匹配一个文字点,即 \。用正则表达式的说法。但是,因为正则表达式模式是作为 R 中的字符串输入的,所以我需要再添加一层转义,给我们“\\.”。是否有任何理由不能直接输入正则表达式模式,例如正则表达式(\。)?也许这一切都会很快成为我的第二天性;作为一个初学者,我觉得这有点令人困惑。

标签: rregexstringr

解决方案


基本问题是正则表达式由 R 中的函数处理,它们不是语言的内置部分。构建它们需要在读取 R 代码时改变字符的解析方式。由于正则表达式不是该语言的核心,因此这被视为不必要的复杂化。

更具体地说,要让 R 解析器处理regex(\.),您需要一个新的保留字 ( regex),并定义一个全新的解析模式,并具有其自身的复杂性。例如,两者""都是")"合法的正则表达式。(忽略引号,只考虑其中的字符。)将它们放在您建议的语法中看起来像regex()and regex()),因此当 R 解析器遇到第一个时,它必须向前看)才能知道正则表达式的结束位置。但"))"也是合法的,那么它怎么知道在哪里停下来呢?

将正则表达式放入字符串会增加额外的转义层,但至少不会使解析器的设计复杂化。

编辑添加:

从 R 4.0.0 开始,由于此 NEWS 条目中描述的字符串文字的新语法,编写正则表达式的情况更好:

有一种用于指定原始字符常量的新语法,类似于 C++ 中使用的语法:r"(...)" with ... any character sequence without the sequence )"。这使得编写包含反斜杠的字符串变得更容易或单引号和双引号。有关更多详细信息,请参阅 ?Quotes。

因此,如果您想输入\.,请将...上面的内容替换为您想要的内容,而无需转义:

r"(\.)"

这与“\.”的解析方式相同。这不完全是你想要的,但它有点接近。


推荐阅读