Как остановить матч при первом совпадении каждой строки? - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь остановить сопоставление с образцом при первом появлении нескольких строк

Ниже приведены строки, которые я хочу сопоставить, используя AZ | 0-9_A-Z

248_HIGH_FAN_BLADE,
67B_COOLER_BLADE,
BLADE_LOW_DIM
[A-Z|0-9\_A-Z](.*?)

Я хотел бы сопоставить 8_H в первой строке, B_C во второй строке, E_L только в третьей строке. Никаких других совпадений показывать не следует.Я пытаюсь на сайте regex101 с помощью PHP и реализовать в R

Ответы [ 3 ]

1 голос
/ 27 июня 2019

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

(?m)^.*?\K[0-9A-Z]_[0-9A-Z]

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

Код соответствия R :

x <- "248_HIGH_FAN_BLADE,\n67B_COOLER_BLADE,\nBLADE_LOW_DIM"
regmatches(x, gregexpr("(?m)^.*?\\K[0-9A-Z]_[0-9A-Z]", x, perl=TRUE))
# => [[1]]
# => [1] "8_H" "B_C" "E_L"

Детали

  • (?m) - многострочный модификатор, задающий ^ совпадение начала строки
  • ^ - начало строки
  • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \K - оператор сброса совпадений
  • [0-9A-Z] - заглавная буква / цифра
  • _ - подчеркивание
  • [0-9A-Z] - заглавная буква / цифра

Вы также можете использовать stringr решение на основе регулярных выражений:

library(stringr)
str_match_all(x, "(?m)^.*?([0-9A-Z]_[0-9A-Z])")[[1]][,2]
# => [1] "8_H" "B_C" "E_L"
0 голосов
/ 27 июня 2019

Чтобы соответствовать этому шаблону, вы можете использовать группу захвата и захватить один [A-Z0-9], затем _, а затем один [A-Z0-9]:

\b[A-Z0-9]+([A-Z0-9]_[A-Z0-9])

Пояснение

  • \b Граница слова (или используйте якорь ^, чтобы подтвердить начало строки)
  • [A-Z0-9]+ Матч 1+ раз A-Z или 0-9
  • ( Группа захвата 1
    • [A-Z0-9]_[A-Z0-9] Матч 1 раз A-Z0-9, затем _ и снова один раз A-Z0-9
  • ) Закрыть группу захвата

Regex demo | R демо

Например

library(stringr)
string = "248_HIGH_FAN_BLADE"
pattern = "\\b[A-Z0-9]+([A-Z0-9]_[A-Z0-9])";
str_match_all(string, pattern)[[1]][,2]

Результат

[1] "8_H"
0 голосов
/ 27 июня 2019

Использование stringr:

library(stringr)
str_extract(c("248_HIGH_FAN_BLADE", "67B_COOLER_BLADE", "BLADE_LOW_DIM"), pattern = "[0-9A-Z]\\_[A-Z]" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...