我正在尝试编写更好的代码,所以我想用regex验证我的输入序列,以确保我得到的第一件事只是一个字母A到H,第二个是1到12的数字只要。我是正则表达式的新手,不知道表达式应该是什么样的。如果失效,我也不确定R会抛出什么类型的错误?
在Perl中,我想是这样的:= ~m /([A-M]?))/)
这是我到目前为止对R:
input_string = "A1"
first_well_row = unlist(strsplit(input_string, ""))[1] # get the letter out
first_well_col = unlist(strsplit(input_string, ""))[2] # get the number out
答案 0 :(得分:2)
在R代码中,使用David的正则表达式:[编辑以反映Marek的建议]
validate.input <- function(x){
match <- grepl("^[A-Ha-h]([0-9]|(1[0-2]))$",x,perl=TRUE)
## as Marek points out, instead of testing the length of the vector
## returned by grep() (which will return the index of the match and integer(0)
## if there are no matches), we can use grepl()
if(!match) stop("invalid input")
list(well_row=substr(x,1,1), well_col=as.integer(substr(x,2,nchar(x))))
}
这只会产生错误。如果你想更好地控制错误处理,请查看tryCatch
的文档,这是一个原始的用法示例(而不是像我们之前返回NA那样得到错误):
validate.and.catch.error <- function(x){
tryCatch(validate.input(x), error=function(e) NA)
}
最后,请注意您可以使用substr
提取字母和数字,而不是使用strsplit。
答案 1 :(得分:0)
您专门询问“A到H,然后是0-9或10-12”。调用异常“InvalidInputException”或任何类似命名的对象 - “无效”“输入”“异常”
/^[A-H]([0-9]|(1[0-2]))$/
在伪代码中:
validateData(String data)
if not data.match("/^[A-H]([0-9]|(1[0-2]))$/")
throw InvalidInputException