【发布时间】:2016-08-25 05:01:34
【问题描述】:
我正在使用 javascript 正则表达式来解析一系列 URL。我需要匹配 URL 中的数字(实际上更复杂,但我正在简化),但只想匹配给定单词不在 URL 中的数字。
也就是说,我想排除其中包含“changelogs”一词的行,因此会捕获“1047”、“1048”、“1245 ' 和 '1049' 来自以下列表;
http://www.opera.com/docs/changelogs/unified/1215/
http://www.whatever.com/docs/changelogs/anythingelse/anything/1215/
http://www.blabblah/security/advisory/1047
http://booger/security/advisory/1048/
ftp://msn.global.whatever/somethingelse/1245
whatever/it/doesnt/matter/could/be/anything/i/still/want/this/number/1049/
我知道我需要某种环顾四周、前瞻后瞻的方式,但我正在三振出局。这是我尝试过的最后一种模式;
(?!changelogs)(\d+)
Here is the regex101 sandbox I'm using.
此外,唯一匹配的是实际数字也很重要。我不希望其他任何东西匹配。
这是我的 .NET 代码的样子(注意“BulletinOrAdvisoryPattern”是有问题的正则表达式)...
Regex bulletinPattern = new Regex(@matchingDomain.Vendor.BulletinOrAdvisoryPattern, RegexOptions.IgnoreCase );
Match bulletinMatch = bulletinPattern.Match(referenceTitle);
if (bulletinMatch.Success)
{
//Found the bulletin ID in the NVD Reference Title
return bulletinMatch.Value;
}
【问题讨论】:
-
不知道怎么访问
Match.Groups[1].Value?此外,您不需要正则表达式。为什么要使用正则表达式?此外,如果您需要.NET regex,为什么要使用仅支持 Python/PCRE/JS 的 regex101? -
JavaScript 没有后视功能。您必须使用
^(?!.*\/changelogs(?:\/|$)).*\/(\d+)之类的消费模式。要求 此外,唯一匹配的是实际数字也很重要。我不希望有任何其他匹配。 使这个问题不清楚且无法回答。 -
@WiktorStribiżew 请查看我的编辑以了解我的意思。目前,我所有用于模式匹配的正则表达式都明确匹配我需要的内容(例如,我可能有一个带有单词“duck”的正则表达式,并且“return bulletinmatch.value”将返回完全匹配的鸭子,或者我可能有一个正则表达式匹配数字,并且“return bulletinmatch.value”行将仅返回该数字。我宁愿不必指定一个组,因为该组对于我匹配的每个域都会有所不同。这有意义吗?
-
这是有道理的,这意味着您需要更改该方法以返回特定组。由于匹配值始终为 Group 0,因此您可以指定
0参数来获取 match.value,并指定1获取第一个捕获的值,2获取第二个值,依此类推。在 JS 中你不能这样做。
标签: javascript regex lookahead lookbehind