Группа без захвата для анализа статуса git - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь построить регулярное выражение, чтобы оно соответствовало любому шаблону .c или .h с измененным файлом состояния git -s.

(Найти регулярное выражение здесь: regexr.com / 40afj )

(?:M).*.[c|h]

для использования с этим королем данных:

M  fjdkls/fjdkslm/djks.c
M  fjdkls/fjdkslm/djks.c
M  fjdkls/fjdkslm/djks.h
M  fjdkls/fjdkslm/djks.h
??  fjdkls/fjdkslm/djks.c
??  fjdkls/fjdkslm/djks.c

Можете ли вы объяснить, почему M совпадает, даже если оно находится в группе без захвата?

Ожидаемый результат должен соответствовать полному пути измененного файла.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Он совпадает только с теми, которые начинаются с M, потому что регулярное выражение специально ищет M.

Если вы добавите квантификатор (?) После первой группы, которая должна работать.

(?:M)?.*.[c|h]

Группы без захвата группируют токены без создания группы захвата, они не просматривают содержимое.Если вы хотите захватить все, кроме M, то вам нужно поместить все в группу захвата.

(?:.*?)[^\s]+(.*\.[c|h])

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

0 голосов
/ 28 сентября 2018

Группа Non Capturing означает, что она не перехватывается при совпадении с регулярным выражением.Здесь единственная группа, которая вам нужна, это та, которая соответствует пути к файлу:

[ ADMRCU?!]{2} (.+\.[ch])

При таком регулярном выражении единственная захваченная группа будет содержать путь к файлу.Кроме того, вы должны использовать --porcelain вместо -s.--porcelain должен быть более стабильным и должен использоваться для сценариев.

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