我正在从电子邮件内容中提取链接,因此使用Regex
和String.Split
从已经解析的Content-type: text/html
中提取重要信息。
由于直到现在我从未接触过正则表达式,所以我使用的是在线编辑器,它提供了电子邮件的一部分,并围绕它构建了Regex pattern
。现在看来,它工作得很好,但是我的代码很混乱,原因是我没有完全理解自己写的内容。
我当前处理链接提取的方式是,删除电子邮件的某些部分(HTML标记),然后将获得的字符串分割两次。
这是我在Regex
上进行测试的示例(这正是将Content作为字符串提取时Content的样子,我只是将使用的链接替换为类似的示例):
<div dir="ltr">
<div>Link text == link (link text would be changed to "Protected link"):
<a href="http://www.google.de"
target=5Fblank">
Protected link
</a>
</div>
<div>Link text != link (link text and link would be rewritten and not equal):
<a href="http://www.google.de">
http://www.google.com
</a>
</div>
<div>Link text != link (link would be rewritten but not link text):
<a href="http://www.google.de">
Click!
</a>
</div>
<div>Link text != link (link would be not rewritten, in whitelist):
<a href="http://www.google.de">
Click!
</a>
</div>
<div>Link is not rewritten:
<a href="http://www.google.de">
http://www.google.de
</a>
</div>
<div>Link text != link (no protocol in link text and would be not rewritten):
<a href="http://www.google.de">
www.google.de
</a>
</div>
我使用的Regular Expression
看起来像这样:
"(href=\"[a-zA-Z0-9-:/.=?]*\"*[a-zA-Z0-9=\" ]*)([>a-zA-Z0-9-:/.,;\"=!? \t\n]*)"
将提取的链接和链接文本写入数组后,我将它们拆分了两次。
首先是在此>
字符处,然后是提取的字符串以href="
开头并以"
个字符分割的情况。
var linkParser = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
string[] links = new string[linkParser.Matches(text).Count];
int t = 0;
foreach (Match ma in linkParser.Matches(text))
{
links[t] = ma.Value;
t++;
}
var list = new List<String[]>();
string[] temp;
for (int i = 0; i < links.Length; i++)
{
temp = links[i].Split('>');
list.Add(temp);
}
var pairs = new List<String[]>();
for (int i = 0; i < list.Count; i++)
{
string[] tmp = list[i];
for (int j = 0; j < tmp.Length; j++)
{
if (tmp[j].StartsWith("href=\""))
{
pairs.Add(new String[]
{
tmp[j].Split(new string[]
{
"href=\""
}, StringSplitOptions.None)[1].Split('"')[0], tmp[j + 1]
});
}
}
}
答案 0 :(得分:0)
由于链接用引号引起来,因此您可以将正则表达式简化为(href =“ [^”] +“)。为了说明这一点,它匹配href =“,然后匹配任何数字(不止一个),除引号”外,再匹配引号“。
您还可以使用组直接获取链接,而不用拆分/替换字符串
由于您需要链接及其文本,因此请尝试以下操作:
已编辑:
python2 -c "import crypt,getpass; print crypt.crypt(getpass.getpass(),'$salt')"
此输出为:
var matches = Regex.Matches(str, "<a href=\"(?<link>[^ \"]+)\"[^>]*>(?<text>(.|\n)*?)(?=(<\\/a>))<\\/a>");
for(int i = 0; i < matches.Count; i++)
{
Console.WriteLine($"{matches[i].Groups["link"].Value} {matches[i].Groups["text"].Value}");
}
我希望这就是您要寻找的