如何匹配,但排除正则表达式模式?
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&snap=true&jlkj=kjhkjh&'.match(/cID=+([^&]*)/)[1];
更简单,因为它不需要非捕获组并返回与您的示例相同的结果。以上是关于如何匹配,但排除正则表达式模式?的主要内容,如果未能解决你的问题,请参考以下文章