Я использую C# и стандартный механизм регулярных выражений. net core.
Мне нужен шаблон регулярных выражений;
Поиск по заданному слову (например, «stackoverflow») или парам слов (например: «stackoverflow сайты»), которые не находятся в тегах href / не имеют гиперссылок.
Пример:
Данное слово является "stackoverflow" (Игнорировать верхний регистр символов, нижний регистр.)
<a href="https://stackoverflow.com/">Stackoverflow</a> is very useful site to learn what causes <b>stackoverflow</b> or not.
Другой пример;
<a href="https://stackoverflow.com/">Good stackoverflow site</a> is actually very good site to learn what causes stackoverflow in software.
Мне нужно сначала поймать " stackoverflow "после слова« причины », потому что другие« Stackoverflow »(ы) гиперссылки.
То, что я пробовал до сих пор;
string regexPattern = $@"\b{wordCouple}(.*?)[^</a]\b";
Regex regex = new Regex(regexPattern, RegexOptions.IgnoreCase);
Match match = regex.Match(text);
Но это не работает. Как мне написать это регулярное выражение?
Обновление : Дополнительная информация по запросу и комментарии ;
Я не могу использовать html парсер, потому что бизнес-правил;
У меня есть упорядоченный список для гиперссылки на все слова или группы слов. Мне нужно рассмотреть все "тело html" из-за этих правил.
Правила есть; - Только 1 слово должно быть гиперссылкой для слов 1 группы. - Максимум 3 слова должны быть гиперссылки для всех групп. - Не связывайте гиперссылку слова / группы слов, если она уже гиперссылка.
Итак, вот что я попробовал;
public class HyperlinkWordGroup
{
public HyperlinkWordGroup()
{
Words = new List();
}
///
/// Hyperlink word group name.
///
public string Title { get; set; }
public string Url { get; set; }
///
/// "_self": Opens the linked document in the same frame as it was clicked (this is default).
/// or
/// "_blank": Opens the linked document in a new window or tab.
///
public string UrlTarget { get; set; }
public List Words { get; set; }
}
private string ReplaceBodyAgility(string text, List group)
{
if (string.IsNullOrWhiteSpace(text))
{
return string.Empty;
}
const int maxHyperlinkedCount = 3;
int count = 0;
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(text);
List htmlNodes = doc.DocumentNode
.Descendants()
.ToList();
foreach (HtmlNode htmlNode in htmlNodes)
{
if (count == maxHyperlinkedCount)
{
break;
}
if (! htmlNode.Name.Equals("#text"))
{
// Load next htmlNode because we want texts not tags.
continue;
}
foreach (HyperlinkWordGroup wordGroup in group)
{
foreach (string wordCouple in wordGroup.Words)
{
string regexPattern = $@"\b{wordCouple}\b";
Regex regex = new Regex(regexPattern, RegexOptions.IgnoreCase);
Match match = regex.Match(htmlNode.InnerHtml);
if (match.Success)
{
string link = $" {wordCouple} ";
htmlNode.InnerHtml = htmlNode.InnerHtml.Replace(wordCouple, link, StringComparison.InvariantCultureIgnoreCase);
count = count + 1;
break;
}
}
if (count == maxHyperlinkedCount)
{
break;
}
}
}
return doc.DocumentNode.InnerHtml;
}
Конечно, этот код не работает, потому что мне нужно учитывать порядок «Список групп». Если я запускаю эту функцию, все «$ text» в htmlagilitypack приходят соответственно, но я должен смотреть на все тело html не построчно или не htmltag htmltag.
Вот почему мне нужно регулярное выражение, чтобы найти первое слово или группу слов, которые не связаны гиперссылками.