我正在尝试使用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}
时没有终止,因为'
匹配(.+)
...但是如何让它捕获每个人一组中的标题?
我曾尝试阅读一些C#RegEx教程/说明,但我无法找到我正在寻找的内容(或用正确的措辞描述我正在寻找的内容)。
编辑:发布后几秒钟我就有了尝试这种模式的想法:
var headerPattern = @"\-H[\s][\']{1}([^\']+)[\']{1}";
请注意,该群组现在是([^\']+)
而不是(.+)
。它现在按照我的意愿工作。
此外,我正在使用Regex.Match(...)
,并且应该Regex.Matches(...)
来获取所有匹配项。
但我猜这个问题仍然存在;如何有人在某一点终止群组捕获?我想起了一位朋友在我认为类似的情况中使用forward lookup
一词,但我不知道如何实施。
答案 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`
并且根本不匹配第二个。