【问题标题】:Get individual headers from CURL with Regex Group使用 Regex Group 从 CURL 获取单个标头
【发布时间】:2017-04-24 01:12:07
【问题描述】:

我正在尝试使用 RegEx 组捕获来获取 bash CURL 命令的所有标头,但我遇到了一个问题,它只是抓取一组中的所有标头(以及我不完全了解的另一组)为什么会这样)。

狂欢:

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 个捕获”,“正确”表示我想要捕获的组,但是当我调试代码时,它表明捕获了 2 个组:

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

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

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

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

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

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

另外,我使用的是Regex.Match(...),应该是Regex.Matches(...) 来获取所有匹配项。

但我想这个问题仍然存在;有人如何在某个时候终止组捕获?我记得一个朋友在我认为类似的情况下使用了 forward lookup 这个词,但我不知道如何实现。

【问题讨论】:

    标签: c# regex regex-group


    【解决方案1】:

    您看到的是贪婪与惰性(或非贪婪)匹配的效果。

    贪婪匹配会匹配尽可能多的字符 惰性匹配只会匹配所需数量的字符。

    在您的原始模式中,(.+) 是一个或多个或任何字符的贪婪匹配。所以它会从你的第一个 -H ' 抓取到最后一个 '

    你把它改成([^\']+),也是贪心的,但它提前终止了,因为它不匹配任何字符,它只匹配不是'的字符。

    您可以通过在后面直接添加?*+ 更改为惰性。

    我对标题匹配器的解决方案是(假设您的示例字符串相当代表一致的格式)。

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

    您的朋友指的是积极的前瞻。这期待在字符串中获得成功的匹配,但是它匹配的不是完整匹配字符串的一部分。语法为(?=...)。还有一个负前瞻(?!...) 和正负后瞻,分别为(?&lt;=...)(?&lt;!...)。应该谨慎使用它们,因为它们在较长的字符串上效率非常低。

    例如取以下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`
    

    并且根本不会匹配第二个。

    【讨论】:

    • 太棒了,感谢您的快速回复!如果我理解正确,? 会强制懒惰,因为它本质上会在前面的0+/1+ 上执行0||1 以确保最小匹配?
    • ? 只是懒惰重复字符的语法 - regular-expressions.info/repeat.html
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 2022-08-10
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    相关资源
    最近更新 更多