如何解决grepl 的疯狂意外行为
如何解释 grepl
的以下非常意外的行为?
我在这里使用 grepl
进行基本的字符串匹配,我认为如下所示的默认行为是危险的。
> grepl('a','a')
[1] TRUE
> grepl('a ()','a ()')
[1] TRUE
> grepl('a (b)','a (b)')
[1] FALSE
添加 fixed=TRUE
修复了它。文档说:
pattern:包含要在给定字符向量中匹配的正则表达式的字符串(或fixed = TRUE的字符串)。
普通用户应该从上面的消息中了解到grepl 的默认用法不是字符串匹配而是正则表达式匹配,这不是很清楚。不了解正则表达式的人可能没有意识到将 fixed
保留为其默认值的危险。我认为应该添加一个警告。
在这里发帖主要是为了提醒社区注意这种行为。我花了几个小时的调试时间才将我在 Shiny 应用程序中遇到的问题缩小到这个功能。我从没想过 grepl 会像这样危险。
解决方法
模式:a ()
细分:一个 a
后跟一个空格
,然后是一个捕获的空/空字符,即 Nothing。
a 和空格匹配字符串的第一部分。因此可以在字符串中找到整个模式。 TRUE
第二部分:
模式:a (b)
分解。字面意思是 a b
,即 a
然后空格然后 b
。但是我们捕获了 b
,因此 b
周围的括号。
字符串有 a (b)
。由于 b 没有跟在空格后面,因此无法在字符串中获得整个模式,因此 FALSE
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。