R регулярное выражение для проверки правильности ввода пользователя - PullRequest
0 голосов
/ 16 марта 2010

Я пытаюсь попрактиковаться в написании лучшего кода, поэтому я хотел проверить правильность введенной последовательности с помощью регулярных выражений, чтобы убедиться, что первое, что я получаю, это только одна буква от 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  

Ответы [ 2 ]

2 голосов
/ 16 марта 2010

В коде R, используя регулярное выражение Дэвида: [отредактировано, чтобы отразить предложение Марека]

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.

0 голосов
/ 16 марта 2010

Вы специально спрашивали "от А до Н, затем 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...