正则表达式判断字符能否转为数值出错问题排查
问题分析与解决
你的正则表达式有两个核心问题:
.未转义:正则里的.是元字符,能匹配任意单个字符,不是字面意义的小数点。要匹配实际的小数点,必须写成\.(在R的字符串里需要转义成\\.,因为R本身的字符串转义规则)。- 缺少全字符串匹配锚点:
stringr::str_detect()默认是部分匹配,只要字符串里有符合正则的片段就返回TRUE。比如"4."里的"4"已经满足-{0,1}[0-9]+这部分,所以会返回TRUE。你需要用^(字符串开头)和$(字符串结尾)锚点,强制正则匹配整个字符串。
修正后的正则如下,测试"4."会返回FALSE,符合你的要求:
stringr::str_detect("4.", pattern = "^-{0,1}[0-9]+(\\.[0-9]+){0,1}$")
像"4.5"、"123"、"-7.89"这类合法数值字符串则会返回TRUE。
你也可以简化写法,把-{0,1}替换成-?(?等价于{0,1},表示0或1次匹配):
stringr::str_detect("4.", pattern = "^-?[0-9]+(\\.[0-9]+)?$")
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

