Получите отдельные заголовки от CURL с Regex Group

Я пытаюсь получить все заголовки команды bash CURL с помощью захвата группы RegEx, но у меня возникла проблема, когда она просто захватывает все заголовки в одной группе (и другой группе, которую я точно не знаю, почему это происходит).

Баш:

curl '<url>' -H 'origin: <url>' -H 'accept-endocing: <...>' -H 'accept-language: <...>' <continues with more headers> --data '<...>'

и это продолжается с другими заголовками.

Код:

var rawBash = RawBash.Text;
var headerPattern = @"\-H[\s][\']{1}(.+)[\']{1}";
var headers = Regex.Match(rawBash, headerPattern);

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

  1. Весь CURL, начиная с первого "-H"
  2. Весь CURL, начинающийся с "origin:"

Что происходит? Я предполагаю, что Regex принимает (.+) и не заканчивается, когда он попадает в [\']{1} так как ' Матчи (.+)... но как мне сделать так, чтобы он захватывал каждый отдельный заголовок в группе?

Я пытался прочитать несколько учебных пособий / описаний по C# RegEx, но я не смог найти то, что я ищу (или описать то, что я ищу в правильной формулировке).

РЕДАКТИРОВАТЬ: буквально через несколько секунд после публикации у меня была идея попробовать этот шаблон:

var headerPattern = @"\-H[\s][\']{1}([^\']+)[\']{1}";

Обратите внимание на группу сейчас ([^\']+) вместо (.+), Сейчас работает так, как я хочу.

Также я пользуюсь Regex.Match(...)и так должно быть Regex.Matches(...) чтобы получить все спички.

Но я думаю, что вопрос вроде как все еще стоит; как кто-то может прекратить групповой захват в точке? Я вспоминаю друга, используя термин forward lookup в том, что я считаю, была похожая ситуация, но я понятия не имею, как реализовать.

1 ответ

Решение

То, что вы видите, это эффекты жадного или ленивого (или не жадного) сопоставления.

Жадное сопоставление будет соответствовать как можно большему числу символов. Ленивое сопоставление будет соответствовать только столько символов, сколько требуется.

В вашей оригинальной модели (.+) жадное совпадение одного или нескольких или любого символа. Так что хватит с твоего первого -H ' до конца '

На что ты изменил это, ([^\']+), также жадный, но завершается рано, потому что не соответствует ни одному символу, только совпадающие символы, которые не являются ',

Вы можете изменить * или же + ленивый, добавив ? сразу после.

Мое решение для вашего сопоставителя заголовков заключается в том (предположим, что ваш пример строки довольно представительно согласованного формата).

\-H\s+\'(.+?)\'

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

Например, возьмите следующие 2 строки:

regex isnt always the right answer|this will match

regex isnt always the right answer|this will not

если бы я использовал следующий шаблон:

regex (is.*) always (the right answer(?=.*this will match))

приведет к этому для первой строки:

Full match  0-34    `regex isnt always the right answer`
Group 1.    6-10    `isnt`
Group 2.    18-34   `the right answer`

и не будет соответствовать второму вообще.

Другие вопросы по тегам