Регулярное выражение для проверки входной строки в R


Я пытаюсь написать регулярное выражение в R, чтобы проверить пользовательский ввод и запустить программу соответственно. Ожидается 3 типа запросов, все они являются символьными векторами.

query1 = "Oct4[Title/Abstract] AND BCR-ABL1[Title/Abstract] 
         AND stem cells[Title] AND (2000[PDAT] :2015[PDAT])"
query2 <-c("26527521","26711930","26314551")

Работает следующий код. Но проблема заключается в ограничении специальных символов в обоих случаях

all(grepl("[A-Za-z]+",query,perl=TRUE)) validates False for query 2 

Или как предложил @sebkopf

all(grepl("^[0-9 ,]+$", query)) # evaluates to TRUE only for query 2

Однако запрос 1 также принимает в качестве входных данных год, что означает, что его числовой ввод должен быть принят для запроса 1. Чтобы добавить сложности, space , . - [] () разрешены в query1. И, формат для query2, должны быть только числа, разделенные , or space. Все остальное должно выдать ошибку.
Как включить оба эти условия в регулярное выражение R ? Таким образом, следующие if conditions проверяются соответствующим образом для запуска соответствующих кодов ?

 if (grepl("regex for query 1& 2",query,perl=TRUE) == True {
 Run code 1
} else { print ("these characters are not allowed @ ! & % # * ~ `_ = +") }  
 if (grepl("regex for query3",query,perl=TRUE) == True {
 Run code 2
} else { print ("these characters are not allowed @ ! & % # * ~ `_ = + [] () - . ")}
1 2

1 ответ:

В ваших текущих регулярных выражениях вы просто ищете возникновение паттерна ("[A-Za-z]+") в любом месте запроса. Если вы хотите специально разрешить только определенные шаблоны символов, вам нужно убедиться, что они совпадают по всему запросу с помощью "^...$".

С регулярными выражениями всегда есть несколько способов сделать что-либо, но чтобы предоставить пример для сопоставления запроса без специальных символов (но все остальное разрешено), вы можете использовать следующее (Здесь завернутый в all, чтобы учесть, что ваш query3 является вектором):

all(grepl("^[^@!&%#*~`_=+]+$", query)) # evaluates to TRUE for your query1, 2 & 3

Для того, чтобы вместо положительного совпадения ловить только те запросы, которые являются числами плюс пробел и запятая:

all(grepl("^[0-9 ,]+$", query)) # evaluates to TRUE only for query3