Рассмотрим вектор ниже:

v <- c("Q7", "Q7a", "Q7_", "Q75")

Мне нужно регулярное выражение, которое соответствует первым трем элементам, но не четвертому. Другими словами, мне нужно регулярное выражение, в котором набор [a-zA-Z_] является необязательным , а числа - нет . Я попытался сделать следующее, но не подмножество только первых трех элементов:

grep("Q7[^[0-9]]", v)
grep("Q7[^[0-9]]?", v)
grep("Q7([^[0-9]])?", v)
grep("Q7[_a-zA-Z]?[^0-9]", v)
grep("Q7$?[^0-9]", v)
1
David Ranzolin 14 Окт 2019 в 23:27

1 ответ

Лучший ответ

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

> grep("^Q7[A-Za-z_]*$", v)
[1] 1 2 3

Здесь ^Q7[A-Za-z_]*$ соответствует

  • ^ - начало строки
  • Q7 - подстрока Q7
  • [A-Za-z_]* - 0+ букв ASCII или _
  • $ - конец строки.

См. демонстрацию регулярных выражений.

В качестве альтернативы вы можете использовать

> grep("^Q7(?:\\D|$)", v)
[1] 1 2 3

Здесь (?:\\D|$) соответствует либо нецифровому (с \D), либо (|) концу строки ($).

См. эту демонстрацию регулярного выражения.

3
Wiktor Stribiżew 14 Окт 2019 в 20:32