关于某些正则表达式的建议

时间:2019-07-09 07:32:59

标签: c# .net regex

我正在从电子邮件内容中提取链接,因此使用RegexString.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]
            });
        }
    }
}

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}");
}

我希望这就是您要寻找的