Совпадение всей строки с шаблоном начала и словом или нет - PullRequest
0 голосов
/ 09 ноября 2019

Допустим, у меня есть определенный файл, похожий на этот:

#tata toto
tata titi
tata tutu titi
#tata titi
tata toto #ZZZ
tata toto   #ZZZ
#tata toto  #ZZZ
tata titi   #YYY
#tata titi #YYY
tata titi toto

Ответ. Я хочу сопоставить каждую строку:

  • , начиная с tata
  • захватить, если toto присутствует или нет

Например, если

tata titi => \1=tata \2=" titi" \3=null \4=null
tata titi toto => \1=tata, \2=" titi ", \3=toto, \4=null
tata toto tutu => \1=tata, \2="  ", \3=toto, \4=" tutu"

Я пробовал это регулярное выражение: ^(tata)(.*)(toto)?(.*)

Но .*захватывает больше, чем ожидалось. Таким образом, toto никогда не записывается.

Как бы вы это сделали?

Чтобы получить больше контекста, я хочу проанализировать / etc / hosts: если я нашел определенный IP (здесь tata),но эта строка не содержит псевдоним имени хоста (здесь toto), мы добавляем его, сохраняя все псевдонимы имени хоста и имени хоста, уже определенные, и комментарий.

Спасибо, Рауль

Ответы [ 2 ]

3 голосов
/ 09 ноября 2019

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

^(tata)( +(?:(?!toto)\S+ *|))(toto|)(.*)$

Демонстрация RegEx

Подробности RegEx:

  • ^: запуск
  • (tata): сопоставление и захват tata в группе # 1
  • (: запуск группы захвата # 2
    • \ +: совпадение с 1+ пробелами
    • (?:: запуск группы без захвата
      • (?!toto): если у нас нет toto на следующей позиции
      • \S+ *: соответствует 1+ непробельным символам, за которыми следуют 0 или более пробелов
      • |: ИЛИ ничего
    • ): конецгруппа без захвата
  • ): конец группы захвата # 2
  • (toto|): группа захвата # 3, которая соответствует toto или ничего
  • (.*): группа захвата # 4, которая соответствует оставшимся символам до конца
  • $: конец
0 голосов
/ 09 ноября 2019

По умолчанию звездочка является жадной, что означает, что она будет потреблять как можно больше. Попробуйте использовать .*? , чтобы сделать его "ленивым" .

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