检查字符串是否包含除数字以外的任何字符

4

我正在寻找正确的表达式,用于搜索一个字符串,如果它只包含数字(0-9)或其他字符,则返回 true/false。

目前我有以下内容:

> teststring <- "012345c6789"
> any(str_detect(teststring,c(letters,LETTERS)))
[1] TRUE

但是这只检查字母,我想要正确的表达式来检查字符串中是否有任何字符不是数字。

如果任何给出的答案解决了您的问题,您能接受其中一个吗?这可以避免其他人浪费时间。 - Heroka
4个回答

8

我们可以使用模式[^0-9]+,并结合grepl函数从字符串开头(^)到结尾($)匹配一个或多个非数字元素。

grepl('^[^0-9]+$', teststring)

6

你可以尝试不使用正则表达式,仅通过转换为数字来实现:

containsOnlyNumbers = function(x) !is.na(as.numeric(x))

str1 <- "012345c6789"
str2 <- "016789"

#> containsOnlyNumbers(str1)
#[1] FALSE
#Warning message:
#In containsOnlyNumbers(str1) : NAs introduced by coercion
#> containsOnlyNumbers(str2)
#[1] TRUE

这应该会更快,但在像“+911”这样的情况下可能不太健壮。 - alexis_laz
嗯,这个特殊情况其实是有歧义的...它可能被视为一个数字...取决于操作者的想法。但确实提出得很好(负号也是如此)。 - Colonel Beauvel

2

这将对你有用

 teststring <- "012345c6789"
 teststring1 <- "0123456789"

 > suppressWarnings({is.na(as.numeric(teststring))})
 > TRUE

 > uppressWarnings({is.na(as.numeric(teststring1))})
 > FALSE

转换为数字是一个不错的解决方法,感谢你们两位的快速解决方案。 - Sebastian
同时发布,我详细说明了太多 ;) 你可以通过添加 ! 来编辑你的答案,因为你想在第一种情况下得到 FALSE,在第二种情况下得到 TRUE。即使有20秒的时间差,我也会删除我的答案以避免重复。 - Colonel Beauvel
但在他的示例中,当字符串不仅包含数字时,他返回TRUE - Paul

1

你可以否定这个模式。

!grepl('[0-9]|^$', string)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接