Проблема с оператором отрицательного прогнозирования в регулярном выражении - PullRequest
1 голос
/ 03 июля 2019

У меня есть строка ==a==123==b==456==c==879, и я хотел бы получить буквы и цифры.

Я пробую это с expr ==(.*?)==(.*?).

Это дает мне:

 Match 1
    1.  a
    2.   
    Match 2
    1.  b
    2.   
    Match 3
    1.  c
    2.   

... но цифры отсутствуют.Как я могу получить их?

Я хочу получить это: Это дает мне:

Match 1
1.  a
2.  123
Match 2
1.  b
2.  456
Match 3
1.  c
2.  789

Я считаю, что мне нужно использовать оператор отрицательного прогнозирования, но я не могу понять,как это работает в этом случае.

(Я разделил буквы и цифры только для этого примера. При реальном использовании я могу разделить только на ==.)

1 Ответ

1 голос
/ 03 июля 2019

Вы можете указать регулярному выражению совпадение до == или конец строки, используя

==(.*?)==(.*?)(?===|$)
==([\s\S]*?)==([\s\S]*?)(?===|$) # To also match line breaks in between ==
(?s)==(.*?)==(.*?)(?===|$)       # Also matches line breaks in between == in PHP and many other flavors but Ruby
(?m)==(.*?)==(.*?)(?===|\Z)      # To also match line breaks in between == in Ruby

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

enter image description here

Детали

  • == - строка из двух = символов
  • (.*?) - Группа 1: любые 0 или более символов, кроме символов разрыва строки, как можно меньше
  • ==(.*?) - == и группа 2, соответствующие любым 0 или более символам, кроме символов разрыва строки, как можно меньше
  • (?===|$) - положительный прогноз, требующий == или конца строки непосредственно справа от текущего местоположения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...