reqexp optinal match в строке - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть проблема, я играю с reqexp, и теперь я столкнулся с небольшой проблемой, не могу найти способ обойти, поэтому пришло время спросить.

У меня есть две строки, которые я хочуreqexp on.

netplan.io [0.36.3] (0.40.1~18.04.3 Ubuntu:18.04/bionic-updates [amd64])
nplan (0.40.1~18.04.3 Ubuntu:18.04/bionic-updates [all])

мой reqexp сегодня выглядит следующим образом.с игнорированием регистра, глобальным и многострочным.

(.*) \[(.*)] \((.*) (.*) \[(.*)]

мой результат сейчас

Match 1
Full match  0-71    `netplan.io [0.36.3] (0.40.1~18.04.3 Ubuntu:18.04/bionic-updates [amd64]`
Group 1.    0-10    `netplan.io`
Group 2.    12-18   `0.36.3`
Group 3.    21-35   `0.40.1~18.04.3`
Group 4.    36-63   `Ubuntu:18.04/bionic-updates`
Group 5.    65-70   `amd64`

Проблема в том, что я получил только 1 совпадение, потому что вторая строка не содержит ([....]) матч, и что я хочу, чтобы он взял этот матч, если он существует, я хочу проигнорировать его.

Я много пробовал, но я не совсем понимаю, я думаю, так что надеюсь, что смогуполучить помощь.

1 Ответ

0 голосов
/ 09 декабря 2018

Вам необходимо поместить необязательную деталь в группу без захвата и сделать эту группу без захвата необязательной с помощью ?.Кроме того, чтобы повысить эффективность вашего паттерна и убедиться, что группы соответствуют только столько, сколько им нужно, и не более, вы должны повторить отрицание символа, за которым следует группа, а неиспользуя .* (что потребует возврата):

(\S*) (?:\[([^\]]*)] )?\((\S*) (.*) \[(\S*)]

https://regex101.com/r/b3wxun/2

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