Вы можете использовать
"^[[: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+ цифры в конце.