1

我有以下字符串:

<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"一直到"电子邮件地址后面的所有内容。

我需要正则表达式来匹配电子邮件地址,而正则表达式必须在其中执行此操作的平台是 Notepad++

关于为什么它匹配所有内容而不是它应该匹配的任何想法(.*?)

4

3 回答 3

2

由于您能够使用 JavaScript,因此我建议您使用以下解决方案。我认为它比应该以任何方式解析 HTML 的正则表达式更好。

这是我在 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

请参阅此问题,了解为什么它是比使用正则表达式更好的方法。


在正则表达式中,这通常是通过向后看来完成的

(?<=Customer Email.*?mailto:)(.*?)(?=")
于 2013-03-19T02:08:54.480 回答
0

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

于 2013-03-19T02:09:48.823 回答
-1

* 是通配符。所以它会匹配一切。? 是一个狂野的角色。所以这就是为什么它匹配一切。

于 2013-03-19T02:10:50.883 回答