如何修改grepl正则优化R语言阿姆斯特朗数程序的用户输入校验
正则调整方案
你原来的正则规则过于宽松,存在两个核心问题:
- 允许负号匹配:
[-]{0,1}的规则会放行负数输入 - 允许任意字符插入:规则中的
.是通配符,可匹配字母、符号等所有字符,因此1a4这类输入也能通过校验
如果你要匹配用户提示要求的3位正整数,直接替换grepl的规则为:
grepl("^[1-9]\\d{2}$", x)
规则说明:
^匹配字符串开头,$匹配字符串结尾,确保输入没有多余前后缀[1-9]限制第一位只能是1-9的正整数,排除0开头和负号输入\\d{2}要求第一位后紧跟2位0-9的数字,刚好凑成3位长度
这条规则会直接拦截负数、非3位长度、夹杂非数字字符的所有非法输入,完全符合你的需求。
如果你不需要限制3位,只要是正整数就放行,可以用这条规则:
grepl("^[1-9]\\d*$", x)
修改后的完整代码
armstrong <- function(x) { if (grepl("^[1-9]\\d{2}$", x) == FALSE) { stop("Please try submitting a valid number") } else { temp <- strsplit(as.character(x), split = "") y <- sapply(temp, function(y)sum(as.numeric(y)^length(y))) if (y == x) { print(paste("The number you entered,", x ,", is an Armstrong number")) } else { print(paste("The number you entered,", x ,", is not an Armstrong number")) } } } armstrong(readline(prompt = "Please enter a three digit positive number"))
内容的提问来源于stack exchange,提问作者s-mabdurrazak
相关产品推荐
相关产品推荐

