Regex grepl для конкретного и повторяющегося шаблона - PullRequest
2 голосов
/ 03 июля 2019

Для сопоставления строк в формате "lkas32kj_123_3.21" я использую (в R)

grepl("^[[:alnum:]]+_[[:digit:]]+_[[:digit:]]+\\.{0,1}[[:digit:]]+$", "lkas32kj_123_3.21")

Как я могу распространить это на случаи с | повторяющимися / составными строками любой длины , такими как (длина три) "lkas32kj_123_3.21 | l3kj_12_0.21 | 123e_4_32.1".

Есть ли способ сделать вложенный (рекурсивный?) Шаблон?

1 Ответ

2 голосов
/ 03 июля 2019

Вы можете использовать

"^[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?(?:\\|[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?)*$"

См. Демоверсию regex

В R используйте

x <- c("lkas32kj_123_3.21", "lkas32kj_123_3.21|l3kj_12_0.21|123e_4_32.1", "+++NO+++")
rx <- "[[:alnum:]]+(?:_\\d+){2}(?:\\.\\d+)?"
grepl(paste0("^", rx, "(?:\\|", rx ,")*$"), x)

См. Демоверсию R онлайн .

Шаблон выглядит так: ^{single_item_regex}(?:\|{single_item_regex})*$. Это соответствует:

  • ^ - начало строки
  • {single_item_regex} - шаблон, который вы используете для отдельного элемента (заметьте, я заменил [[:digit:]] на \d, чтобы сделать его короче, но если вам нужно придерживаться класса символов POSIX, вы можете)
  • (?: - запуск группы без захвата:
    • \| - труба
    • {single_item_regex} - шаблон одного предмета
  • )* - конец группы, повторите 0 или более раз
  • $ - конец строки.

В шаблоне с одним элементом я предлагаю заменить \.{0,1}\d+ на (?:\.\d+)?, так как здесь есть намерение сопоставить дополнительные . и 1+ цифры в конце.

...