正则表达式捕获所有内容而不仅仅是括号中的“通配符” - 如何修复它?

时间:2013-03-19 02:07:15

标签: javascript regex web-scraping notepad++

我有以下字符串:

<p class=MsoNormal><b>Customer Email: <o:p></o:p></b></p></td><td width=""75%"" valign=top style='width:75.0%;border:none;padding:0in 0in 11.25pt 0in'><p class=MsoNormal><a href=""mailto:username@gmail.com""">

我正在尝试使用正则表达式从上面的字符串中捕获电子邮件地址(username@gmail.com)。我正在使用以下正则表达式:

Customer Email.*?mailto:(.*?)"

在Notepad ++中测试上述正则表达式,而不仅仅是匹配电子邮件地址,它匹配从(包括)"Customer Email"一直到电子邮件地址后面的"的所有内容。< / p>

我需要正则表达式才能匹配电子邮件地址,正则表达式必须执行的平台是Notepad ++

有关为什么匹配所有内容的想法,而不仅仅是(.*?)

中应匹配的内容

3 个答案:

答案 0 :(得分:2)

由于您可以使用JavaScript,我建议使用以下解决方案。我认为这比使用 NOT 以任何方式解析HTML的正则表达式更好。

这是how I would do it in JavaScript

var a = document.createElement("div"); //create a wrapper
a.innerHTML = '<p class=MsoNormal><b>Customer Email: <o:p></o:p></b></p></td><td width="\"75%\"" valign=top style=\'width:75.0%;border:none;padding:0in 0in 11.25pt 0in\'><p class=MsoNormal><a href="mailto:username@gmail.com">'; //your data
var ps = a.querySelectorAll("p"); //get all the p tags
var emails = [];
[].forEach.call(ps,function (pTag) { //for each p tag
    if(pTag.textContent.indexOf("Customer Email")===-1){
        return;//only add those with Costumer Email
    }
    var as= (pTag.querySelectorAll("a")); //get the links from it
    [].forEach.call(as,function(aTag){
        if(aTag.href && aTag.href.substring(0,7)==="mailto:"){ //for mailto links
           //got a match
               emails.push(aTag.href.substring(7)); //add the email address
        }
   });
});
console.log(emails); //emails now contains an array of your extracted emails

请参阅this question,了解为什么它比使用正则表达式更好。


在正则表达式中,这通常使用lookbehind

完成
(?<=Customer Email.*?mailto:)(.*?)(?=")

答案 1 :(得分:0)

匹配的内容以及捕获的内容完全不同。它只会捕获捕获组中的内容。尝试在代码中实际使用它。

答案 2 :(得分:-1)

*是狂野的角色。所以它将匹配一切。 ?是一个狂野的角色。这就是为什么它匹配所有东西。