Использование Regex для объединения данных с разделителями - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь оптимизировать пару приложений с помощью регулярных выражений.

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

Переменная fruits имеет следующее значение: apple_banana_kiwi_cherry_cucumber_tomato_car_telephone

Хватайте все, что между 2-м и 5-м появлением _

Например, в случае apple_banana_kiwi_cherry_cucumber_tomato_car_telephone

результат должен быть:

kiwi_cherry_cucumber

Сейчас у меня есть ^[a-zA-Z]+_[a-zA-Z]+_([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)_

Это самый эффективный способ извлечения данных из строки? Кроме того, есть ли лучший способ написать это утверждение, чтобы его было легче читать?

1 Ответ

1 голос
/ 27 марта 2019

Вы можете использовать это регулярное выражение и захватить содержимое группы 1,

(?:[^_]*_){2}((?:[^_]*_){2}[^_]*)

Демо

Объяснение:

  • (?:[^_]*_){2} - эта часть захватывает некоторый текст, содержащий ровно два подчеркивания.
  • ((?:[^_]*_){2}[^_]*) - эта часть захватывает некоторый текст, который снова содержит некоторый текст, имеющий ровно дваподчеркивание плюс некоторый текст ноль или более символов, отличных от _, с использованием [^_]* и прекращение захвата в тот момент, когда оно кажется пятым подчеркиванием, и захватывает этот текст в группу 1.

Впредь, предоставляя вам весь контент междувторое подчеркивание и пятое подчеркивание в группе 1.

Кроме того, в случае, если вам нужно только первое совпадение, а не несколько совпадений, вы можете иметь начальный якорь ^ перед регулярным выражением и использовать его следующим образом:

^(?:[^_]*_){2}((?:[^_]*_){2}[^_]*)

Демонстрация только с первым совпадением

Кроме того, ваше регулярное выражение ^[a-zA-Z]+_[a-zA-Z]+_([a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+)_ также правильно, но разрешает только алфавиты, поэтому используйте его, если вытолько хочу, чтобы всемежду символами подчеркивания - низкий алфавит, иначе я использую мое регулярное выражение, а мой - немного более компактную форму, поскольку он использует квантификаторы.Кроме того, мое регулярное выражение поможет вам расширить в случае, скажем, завтра вы говорите, что я хочу сопоставить весь контент между подчеркиванием от N до Mth, где N и M могут быть большими числами, и в этом случае это короткое регулярное выражениепоможет.

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