Извлечь только <string>/ <string>или <string>после определенного слова - PullRequest
2 голосов
/ 28 апреля 2019

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

  • Исправление пользователя в ожидании слияния / задача A для выполнения
  • Функция UserB Pending Merge / taskC_expansion выполнена
  • UserC ожидает слияния, чтобы сделать
  • Исправление UserD Pending Merge для выполнения

Строка после Pending Merge - это имя ветви.

Как извлечь имя ветви после слова Pending Merge, чтобы оно также работало для случаев, когда строка не является / и является только "исправлением"?

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

Я пытался:
[^ в ожидании слияния]. (\ W *) первое слово сопоставляется с "to".
в ожидании слияния (. \ W + \ W + \ w +) , но в случае "исправления, ожидающего слияния для выполнения", оно соответствует "исправлению" к "

Ответы [ 3 ]

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

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

Pending Merge\s+(\S+\/\S+|hotfix\b)

И захватить вашу ветку из группы1

Строки, в которых нет строки этого формата string1/string2, не будут совпадать, и я надеюсь, что это то, что вы ожидаете.

Regex Demo

var arr = ['UserA Pending Merge hotfix/taskA to do','UserB Pending Merge feature/taskC_expansion done','UserC Pending Merge to do','UserD Pending Merge hotfix to do']

for (s of arr) {
  var m = /Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)
  if (m != null) {
	  console.log(s + " --> " +/Pending Merge\s+(\S+\/\S+|hotfix\b)/i.exec(s)[1])
  } else {
    console.log('No branch found')
  }
}
1 голос
/ 28 апреля 2019

Вы можете использовать

/pending merge\s*(.*?)\s*(?:to do|done)/i

См. Демоверсию regex .

Подробности

  • pending merge - буквальная подстрока
  • \s* - 0+ пробелов
  • (.*?) - Захват группы 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \s* - 0+ пробелов
  • (?:to do|done) - либо to do или done.

enter image description here

JS демо:

var strs = ['UserA Pending Merge hotfix/taskA to do',
'UserB Pending Merge feature/taskC_expansion done',
'UserC Pending Merge to do',
'UserD Pending Merge hotfix to do'];
var regex = /pending merge\s*(.*?)\s*(?:to do|done)/i;
for (var s of strs) {
  console.log(s);
  var m = s.match(regex);
  if (m) {
    console.log("FOUND: ", m[1]);
  }
}
0 голосов
/ 28 апреля 2019

Этот простой RegEx может помочь вам сделать это:

User[A-Z] Pending Merge\s(.+)

enter image description here

Было бы просто создать левую границу при использовании:

User[A-Z] Pending Merge\s

и извлечь все после использования этой группы захвата (.+).

Вы можете добавить дополнительную границу к этой группе, если хотите.

(User[A-Z]{1} Pending Merge\s)(.+|)(?:to\sdo|done)

enter image description here

Затем вы можете упростить его до чего-то похожего на этот RegEx :

User[A-Z]{1} Pending Merge\s(.+|)(to\sdo|done)

enter image description here

, и вы можете назвать его, используя $ 1 , который является первой группой захвата с желаемой целью.

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