如何匹配,但排除正则表达式模式?

Posted

技术标签:

【中文标题】如何匹配,但排除正则表达式模式?【英文标题】:How can I match on, but exclude a regex pattern? 【发布时间】:2011-03-01 12:08:09 【问题描述】:

我有这个网址:

http://example.com/createSend/step4_1.aspx?cID=876XYZ964D293CF&snap=true&jlkj=kjhkjh&

还有这个正则表达式模式:

cID=[^&]*

产生这个结果:

cID=87B6XYZ964D293CF

如何删除“cID=”?

谢谢

【问题讨论】:

什么语言?你在工作吗? 您使用的是哪个正则表达式解析器? 抱歉,我应该更具体一些。我正在使用 javascript 【参考方案1】:

你可以使用lookbehind(不是在Javascript中):

(?<=cID=)[^&]*

或者你可以使用分组并抓住第一组:

cID=([^&]*)

【讨论】:

【参考方案2】:

一般来说,要完成这样的事情,您至少有 3 个选项:

使用环视,因此您可以精确匹配您想要捕捉的内容 遗憾的是,Javascript 中没有后视功能 使用捕获组捕获特定字符串 几乎普遍支持所有口味 如果所有其他方法都失败了,您可以随时选择匹配的substring 如果要截断的前缀/后缀的长度是已知常数,则效果很好

参考文献

w3schools - jsref - substring regular-expressions.info/Capturing groups 和 Lookarounds Flavor comparison

示例

给定这个测试字符串:

i have 35 dogs, 16 cats and 10 elephants

这些是一些正则表达式模式的匹配:

\d+ cats -> 16 cats (see on rubular.com) \d+(?= cats) -> 16 (see on rubular.com) (\d+) cats -> 16 cats (see on rubular.com) 第 1 组捕获 16

您也可以进行多次捕获,例如:

(\d+) (cats|dogs) 产生 2 个匹配结果 (see on rubular.com) 结果 1:35 dogs 第 1 组捕获 35 第 2 组捕获 dogs 结果 2:16 cats 第 1 组捕获 16 第 2 组捕获 cats

【讨论】:

【参考方案3】:

使用 JavaScript,您需要在正则表达式中使用 capture group(将要捕获的部分放入 ()

var url = 'http://example.com/createSend/step4_1.aspx?cID=876XYZ964D293CF&snap=true&jlkj=kjhkjh&';

var match = url.match(/cID=([^&]*)/);
// ["cID=876XYZ964D293CF", "876XYZ964D293CF"]

// match[0] is the whole pattern
// match[1] is the first capture group - ([^&]*)
// match will be 'false' if the match failed entirely

【讨论】:

【参考方案4】:

通过使用捕获组:

cID=([^&]*)

然后得到 1 美元:

87B6XYZ964D293CF

【讨论】:

【参考方案5】:

这是 Javascript 代码:

 var str = "http://example.com/createSend/step4_1.aspx?cID=876XYZ964D293CF&snap=true&jlkj=kjhkjh&";
    var myReg = new RegExp("cID=([^&]*)", "i");
    var myMatch = myReg.exec(str);
    alert(myMatch[1]);

【讨论】:

【参考方案6】:

在 javascript 中有一种特殊的语法可以让你从结果中排除不需要的匹配。语法是“?:” 在您的情况下,解决方案如下

'http://example.com/createSend/step4_1.aspx?cID=876XYZ964D293CF&snap=true&jlkj=kjhkjh&'.match(/(?:cID=+)([^&]*)/)[1];

【讨论】:

这太过分了。 'http://example.com/createSend/step4_1.aspx?cID=876XYZ964D293CF&amp;snap=true&amp;jlkj=kjhkjh&amp;'.match(/cID=+([^&amp;]*)/)[1]; 更简单,因为它不需要非捕获组并返回与您的示例相同的结果。

以上是关于如何匹配,但排除正则表达式模式?的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式匹配模式后排除子字符串

如何使用正则表达式匹配不以某些字符开头或结尾的单词?

正则表达式匹配引号外的逗号 - XML 模式变体

正则表达式如何匹配汉字?

Perl 正则表达式 |如何从文件中排除单词

求教正则表达式如何匹配