Регулярное выражение для проверки входной строки в 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 ответ:
В ваших текущих регулярных выражениях вы просто ищете возникновение паттерна (
"[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