Regex Извлечь строку между двумя словами, содержащую определенную строку - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть строка ниже

abc-12d-ef-oy-5678-xyz--**--20190120075439322am--**--ghi-66d-ef-oy-8877-sdf--**--sfdfdsgfg--**--20190120075765487am

Это своего рода многосимвольная строка, разделенная символом '- ** -' Я пытаюсь извлечь первое и второе слова, которые имеют -ой- теги в нем.Это столбец в таблице.Я использую метод regex_extract, но я не могу извлечь строку, которая содержит строку и заканчивается строкой.

Вот один шаблон, который я попробовал .*(.*oy.*)--

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Вы можете использовать это регулярное выражение, которое будет соответствовать строке, содержащей -oy-, и захватывать их в group1 и group2.

^.*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*).*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*)

Это регулярное выражение в основном совпадает с двумя разделителями строк, содержащими -oy-, используя это (\w+(?:-\w+)*-oy-\w+(?:-\w+)*)для захвата текста.

Демо

0 голосов
/ 28 февраля 2019

Вы можете выбрать значения из групп захвата?

(?:--\*\*--|^)(.*?-oy-.*?)(?:--\*\*--|$)

?: - Группа без захвата, соответствует разделителю, началу или концу строки, но делаетне создать группу захвата

*?- Ленивое совпадение, поэтому вы только захватываете содержимое поля

https://regex101.com/r/aUAvcx/1

--- Второй удар в этом случае следует ---

Это запутанно.Надеюсь, вы можете использовать Lookahead и Lookbehind.Последняя проблема, с которой я столкнулся, заключалась в том, что «Greedy» и еще до этого высасывали поле.Поэтому мне пришлось добавить исключение в группу захвата для вашего разделителя.

Проверьте, работает ли это для вас.

(?<=--\*\*--|^)((?:(?:(?!--\*\*--).)*)-oy-(?:(?:(?!--\*\*--).)*))(?=--\*\*--|$)

https://regex101.com/r/aUAvcx/3

По сути, (?: Мы не получаем слишком много групп захвата для работы.

Это состоит из трех частей:

  1. Взгляд за спиной - Убедитесь, что полеобрамляется разделителем (или началом строки)
  2. Группа захвата - захватить содержимое поля, убедившись, что разделитель не засосан в него
  3. Взгляд в будущее - Убедитесь, чтополе обрамлено разделителем (или концом строки)

Что касается группы захвата, я проверяю левую и правую часть -oy-, чтобы убедиться, что разделитель неесть.

0 голосов
/ 28 февраля 2019

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

[a-z0-9]+(?:-[a-z0-9]+)*-oy(?:-[a-z0-9]+)+

Regex details

  • [a-z0-9]+ совпадение 1+ раз a-z0-9
  • (?: группа без захвата
    • -[a-z0-9]+ совпадение - и1+ раз a-z0-9
  • )* Закрыть группу и повторить 0+ раз
  • -oy Совпадение буквально
  • (?:-[a-z0-9]+)+Повторите 1+ раз группу, которая будет соответствовать - и 1+ раз a-z0-9

Вы можете расширить класс символов [A-Za-z0-9], чтобы разрешить то, что вы хотите сопоставить, как символы верхнего регистра.

Regex demo | Демонстрация Java

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

(?<=^|--\\*\\*--)[a-z0-9]+(?:-[a-z0-9]+)*-oy(?:-[a-z0-9]+)+(?=--\\*\\*--|$)

См. Javaдемо

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