Советы по определенному регулярному выражению - PullRequest
1 голос
/ 09 июля 2019

Я работаю над извлечением ссылок из содержимого электронных писем и поэтому использую Regex и String.Split для извлечения важной информации из уже проанализированного Content-type: text/html.
, так как я никогда не связывался с регулярными выражениями дотеперь я использовал онлайн-редактор, который предоставил часть своего электронного письма и построил вокруг него Regex pattern.Сейчас, похоже, все работает отлично, но мой код - беспорядок, вызванный тем, что я не совсем понимаю, что я написал.

В настоящее время я работаю с извлечением ссылок, удаляя определенные части письма (которыеHTML-теги), а затем дважды разделяет полученную строку.

Это пример, на котором я протестировал свой Regex (именно так выглядит Контент, когда я извлекаю его как строку, я просто заменилиспользовали ссылки с похожими примерами):

<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 голосов
/ 09 июля 2019

Поскольку ссылки заключены в кавычки ", вы можете упростить это регулярное выражение до этого (href =" [^ "] +").Чтобы прояснить это, он соответствует href = ", затем соответствует любому числу (более одного) любого символа, кроме символа кавычки, затем символа кавычки.
Вы также можете использовать группы, чтобы получить ссылку непосредственно вместо разделения/ замена строки

Так как вам нужна ссылка и ее текст, попробуйте это:
Отредактировано:

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

Вывод для этого:

http://www.google.de             Protected link    
http://www.google.de         http://www.google.com    
http://www.google.de         Click!    
http://www.google.de         Click!    
http://www.google.de         http://www.google.de    
http://www.google.de         www.google.de    

Надеюсь, это то, что вы ищете

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...