r - 为什么 R 中的正则表达式搜索查询由字符串表示?
问题描述
为什么正则表达式模式必须由 R 中的字符串(或者,更具体地说,stringr)表示?
这个问题不是关于为什么我必须转义一个点来匹配一个正则表达式的文字点,而是为什么我必须两次将它排除,因为它在 R 中被写为一个字符串。
例如,如果我想将字符串 "ab" 转换为 "a,b",我需要匹配一个文字点,即 \。用正则表达式的说法。但是,因为正则表达式模式是作为 R 中的字符串输入的,所以我需要再添加一层转义,给我们“\\.”。是否有任何理由不能直接输入正则表达式模式,例如正则表达式(\。)?也许这一切都会很快成为我的第二天性;作为一个初学者,我觉得这有点令人困惑。
解决方案
基本问题是正则表达式由 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"(\.)"
这与“\.”的解析方式相同。这不完全是你想要的,但它有点接近。
推荐阅读
- rstudio - 计算 1,000 列的事件之间的天数差异
- angular - Angular 8 canActivate on refresh
- pandas - 关于熊猫 .sample()
- oauth - 雪花 jdbc 驱动程序是否接受其令牌参数的刷新令牌?
- javascript - 如何收听在tinymce中选择的文本?
- entity-framework - 如何使用“dotnet ef 脚手架”从 sqlite 数据库创建模型?
- javascript - 在 Dynamics 365 统一接口中不推荐使用 RibbonActions.js。是否有任何新的 JS 库替换 RibbonActions.js?
- python - 在python中以多个线程下载文件时,线程在所有文件可用之前完成
- cocoapods - “GMSPlace”类型的值在 GooglePlaces Cocoapod 3.3.7 中没有成员“视口”
- html - 为什么 jasmine 单元测试中 document.getElementsByClassName() 的结果为空?