Нужна помощь в построении регулярных выражений - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь найти регулярное выражение для следующих строк (см. Попытки в нижней части сообщения)

CLog_DMT_HPCC2_IWHT91731695_242_AFT1_2019-05-02T07.51.43

Регулярное выражение нормально работает для этой строки, Результат для указанной выше строки:

  • programName = CLog
  • otherRegex = DMT_HPCC2
  • SerialNO = IWHT91731695 (Примечание: серийный номер всегда будет начинаться с «I»)
  • Версия = 242
  • операция = AFT1

что является желаемым результатом

Но для этой строки не работает регулярное выражение

CLOB_ABCD_6KW_SYSTEM_609-784_IWHT91831863_197_ACB_01_2019-05-02T07.03.27

Я хочу получить результат следующим образомдля указанной выше строки

  • имя_программы = CLOB
  • otherRegex = ABCD_6KW_SYSTEM_609-784
  • SerialNO = IWHT91831863
  • версия = 197
  • операция = ACB_01

, но то, что я получаю, показано ниже:

  • programName = CLOB
  • otherRegex = ABCD_6KW_SYSTEM_609-784
  • SerialNO = IWHT91831863 _197
  • Версия = ACB
  • операция = 01

Я пробовал следующее регулярное выражение для вышеуказанных строк:

(?<programName>[a-zA-Z0-9]+)_(?<other>.+)_(?<boardSN>I.+)_(?<entityNameProgramVersion>.+)_(?<operation>.+)_

1 Ответ

2 голосов
/ 02 мая 2019

В вашем паттерне вы используете .+, который является жадным и будет соответствовать до конца строки. Затем он вернется назад, чтобы выполнить оставшуюся часть шаблона. В этом случае он будет пытаться вернуться, чтобы соответствовать всем следующим подчеркиваниям.

Вместо этого вы можете использовать отрицательный символьный класс [^, который не соответствует подчеркиванию или символу новой строки, чтобы ограничить совпадение текущей строкой в ​​случае, когда есть несколько следующих.

Для части other вы можете сделать квантификатор не жадным (?<other>.+?), чтобы он отбрасывал совпадения до тех пор, пока не совпадет _I

^(?<programName>[a-zA-Z0-9]+)_(?<other>.+?)_(?<boardSN>I[^_\n]+)_(?<entityNameProgramVersion>[^_\n]+)_(?<operation>[^\n_]+(?:_[^\n]+)?)_

Объяснение

  • ^ Начало строки
  • (?<programName>[a-zA-Z0-9]+)_ Повторите 1+ раз то, что указано в классе персонажей
  • (?<other>.+?)_ Соответствует любому символу 1+ раз, кроме новой строки без жадности
  • (?<boardSN>I[^_\n]+)_ Класс отрицательных символов, не соответствует _ или символу новой строки
  • (?<entityNameProgramVersion>[^_\n]+)_ Класс отрицательных символов, не соответствует _ или символу новой строки
  • (?<operation>[^\n_]+(?:_[^\n]+)?)_ Класс отрицательных символов, не сопоставляйте _ или символ новой строки с необязательной группой, которая будет соответствовать одному подчеркиванию и не совпадать с подчеркиванием. После этого сопоставьте одно подчеркивание за пределами группы.

Regex demo

Если необязательная группа в конце может состоять только из цифр, вы можете использовать эту часть без последнего подчеркивания:

(?<operation>[^\n_]+(?:_\d+)?)

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...