Regex сопоставить что-либо между несколько раз из журнала Git - PullRequest
0 голосов
/ 30 апреля 2019

Я хочу разбить сообщение журнала git на части, чтобы я мог получить доступ к каждому коммиту и разделить его хэш и сообщение.

Это команда git log:

git log --pretty=short --abbrev-commit -n 2 HEAD

Вот пример журнала:

commit bfb9bac
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Something awesome happened here

commit a4fad44
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Ooh, more awesomeness
    So many lines

то, что я пробовал до сих пор:

([a-f0-9]{7})\n(?:Author.+\n\n)([\s\S]+)(?=\ncommit)

здесь ссылка на RegExr: https://regexr.com/4d523

в конце это должно выглядеть так:

const result = commits.match(regex)

result[0][0] // bfb9bac
result[0][1] // Something awesome happened here

result[1][0] // a4fad44
result[1][1] // Ooh, more awesomeness\n    So many lines

Было бы также хорошо сделать это в два шага;сначала разделить коммиты, а затем разделить хеш и сообщение.

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Вы можете опустить использование [\s\S], сопоставив всю строку, используя .*, и повторить шаблон, соответствующий новой строке, и утверждает, что строка не начинается с коммита:

^commit ([a-f0-9]{7})\nAuthor.*\n+[ \t]+(.*(?:\n(?!commit).*)*)

Объяснение

  • ^ Начало строки
  • commit Match commit , за которым следует пробел
  • ([a-f0-9]{7}) Захват в группе 1, соответствующий 7 раз, что указано в классе персонажей
  • \nAuthor.* Соответствует новой строке, затем автору и 0+ раз любому символу, кроме новой строки
  • \n+[ \t]+ Совпадение 1+ раз новой строки, за которым следуют 1+ пробелы или символы табуляции
  • ( Захватывающая группа
    • .* Совпадение 0+ раз с любым символом, кроме новой строки
    • (?:\n(?!commit).*)* Повторите 0+ раз, совпадая с новой строкой, подтвердите, что справа не зафиксировано, затем сопоставьте любой символ 0+ раз, кроме новой строки
  • ) Закрыть группу захвата

Regex demo

const regex = /^commit ([a-f0-9]{7})\nAuthor.*\n+[ \t]+(.*(?:\n(?!commit).*)*)/gm;
const str = `commit bfb9bac
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Something awesome happened here

commit a4fad44
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Ooh, more awesomeness
    So many lines
`;
let m;

while ((m = regex.exec(str)) !== null) {
  if (m.index === regex.lastIndex) {
    regex.lastIndex++;
  }
  console.log("hash: " + m[1]);
  console.log("message: " + m[2]);
}
1 голос
/ 30 апреля 2019

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

^commit\s+(\S+)\n^Author:[\w\W]+?^\s+((?:(?!commit)[\w\W])+)

Regex Объяснение:

  • ^commit - начинается сопоставление commit в начале строки
  • \s+(\S+)\n - Соответствует одному или нескольким пробелам, за которыми следует значение sha1, которое захватывается в group1, используя (\S+), за которым следует новая строка \n
  • ^Author:[\w\W]+? - Снова начинается сопоставление Author с начала строки, за которым следует двоеточие, за которым следует любой символ, один или несколько раз меньший, насколько это возможно
  • ^\s+ - Это соответствует одному или нескольким пробелам в начале строки, и это точка, с которой сообщение начнет захватываться следующей частью регулярного выражения
  • ((?:(?!commit)[\w\W])+) - Это выражение (также известное как закаленный жадный жетон ) захватывает любой символ, включая символы новой строки, используя [\w\W], но останавливает захват, если видит commit, и помещает все совпадение в группе 2

Regex Demo

Вот демонстрация кода JS,

str = `commit bfb9bac
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Something awesome happened here

commit a4fad44
Author: XXXXX XXXXXXXX <xxx.xxxxx@xxxxx.xxx>

    Ooh, more awesomeness
    So many lines`;

reg = new RegExp(/^commit\s+(\S+)\n^Author:[\w\W]+?^\s+((?:(?!commit)[\w\W])+)/mg);
while(null != (m=reg.exec(str))) {
   console.log("SHA1: " + m[1] + ", Message: " + m[2]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...