从Regex Group获取CURL的各个标题

时间:2017-04-24 01:12:08

标签: c# regex regex-group

我正在尝试使用RegEx组捕获来获取bash CURL命令的所有标头,但是我遇到了一个问题,它只是抓住一个组中的所有标头(以及我不确切知道的另一个组)为什么会发生这种情况。)

bash:

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);

tested the pattern here并且它显示“11 Captures”,“正确”表示我想要捕获的组,但是当我调试代码时,它表示已捕获了2个组:

  1. 从第一个“-H”
  2. 开始的整个CURL
  3. 整个CURL以“origin:”
  4. 开头

    发生了什么事?我猜测正则表达式正在使用(.+)并且当它到达[\']{1}时没有终止,因为'匹配(.+) ...但是如何让它捕获每个人一组中的标题?

    我曾尝试阅读一些C#RegEx教程/说明,但我无法找到我正在寻找的内容(或用正确的措辞描述我正在寻找的内容)。

    编辑:发布后几秒钟我就有了尝试这种模式的想法:

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

    请注意,该群组现在是([^\']+)而不是(.+)。它现在按照我的意愿工作。

    此外,我正在使用Regex.Match(...),并且应该Regex.Matches(...)来获取所有匹配项。

    但我猜这个问题仍然存在;如何有人在某一点终止群组捕获?我想起了一位朋友在我认为类似的情况中使用forward lookup一词,但我不知道如何实施。

1 个答案:

答案 0 :(得分: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`

并且根本不匹配第二个。