c#正则表达式捕获两个字符串之间的字符串[重复]

Posted

技术标签:

【中文标题】c#正则表达式捕获两个字符串之间的字符串[重复]【英文标题】:c# Regex catch string between two string [duplicate] 【发布时间】:2018-03-22 03:33:39 【问题描述】:

我必须在尖括号之间捕获一个值,我将一个'html 页面解析为一个字符串(我不能使用外部库,所以我必须像字符串一样使用那个 html)。我有两个 div 的内容要捕获,我知道他们拥有的 id,我正在尝试使用正则表达式来捕获内容,但我无法做到。

var div_tags = Regex.Match(json, "<div id=(.*)</div>").Groups[0];

这会返回我拥有的所有 3 个带有 id 的 div。但我只需要两个 div,其中 id 包含“mobile”一词。 所以.. 我尝试了我同事建议的另一个正则表达式,但如果认为它与 .net 正则表达式评估器不兼容。

string titolo = Regex.Replace(json, "<div id=[.*]mobile[.*]>(.*)</div>");

这是 div 的一个例子。我需要的唯一值是消息。两个 div 的 id 是 mobileBody 和 mobileTitle。

<div id='mobileBody' style='display:none;'>Message</div>

我的正则表达式有什么问题导致我无法捕捉到正确的文本?

【问题讨论】:

使用像HtmlAgilityPack这样的html解析器。另见***.com/questions/1732348/… 你应该使用 HTML 解析器。 我说我不能使用外部库,所以我不能使用HtmlAgilityPack。 没人知道,如何调整正则表达式以匹配我需要的内容 h̸̡̪̯ͨ͊̽̅̾ȩ̸̡̬̩̪̯̾͛ͪ̈ͨ͊̽̅̾͘ȩ̬̩̾͛ͪ̈͘c̷̙̝͖ͭ̏ͥͮ͟oͮ͏̮̪̝͍m̖͊̒ͪͩͬ̚̚͜ȇ̴̟̟͙̞ͩ͌͝s̨̥̫͎̭ͯ̿̔ span> 【参考方案1】:

你可以试试这个:<[a-z\s]+id=[\'\"]mobile[\w]+[\'\"][\sa-zA-Z\d\'\=\;\:]*>([a-zA-Z\d\s]+)<[\/a-z\s]+> 无论如何,它不会匹配特殊字符或符号。 你可以在这里测试和优化它:https://regex101.com/r/fnYQ1o/10

编辑 - 代码示例 这可能是提取消息的代码部分:

 var rgx = @"<[a-z\s]+id=[\']mobile[\w]+[\'][\sa-zA-Z\d\s\'\=\;\:]*>([a-zA-Z\d\s]+)<[\/a-z\s]+>";
 var txt = "<!DOCTYPE html><html lang='it' xml:lang='it'><!-- <![endif]--><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'><title>Banca Mediolanum S.p.A. | Accesso clienti</title><meta name='description' content='Banca Mediolanum S.p.A. | Accesso clienti'><meta name='keywords' content='Banca Mediolanum S.p.A. | Accesso clienti'><meta name='title' content='Banca Mediolanum S.p.A. | Accesso clienti'><meta name='author' content='Banca Mediolanum S.p.A.'><meta name='robots' content='index, follow'><meta name='viewport' content='width=1439,user-scalable=no'><link rel='shortcut icon' href='./images/favicon.ico' type='image/x-icon'><style>#cort background-image: url(bmedonline_10set.png);background-repeat: no-repeat;background-position-x: center;height: 850px;width: auto;/*background-size: 100%;*/@media only screen and (max-width: 768px) and (min-width: 641px) section.contactus-area.chat body border: 0 none;margin: 0;padding: 0</style></head><body class=' '><!-- Google Tag Manager --><script>(function (w, d, s, l, i) w[l] = w[l] || [];w[l].push('gtm.start': new Date().getTime(),event: 'gtm.js');var f = d.getElementsByTagName(s)[0],j = d.createElement(s),dl = l != 'dataLayer' ? '&l=' + l : '';j.async = true;j.src ='//www.googletagmanager.com/gtm.js?id=' + i + dl;f.parentNode.insertBefore(j, f);)(window, document, 'script', 'dataLayer', 'GTM-KGSP');</script><!-- End Google Tag Manager --><div id='cort'></div><div id='mobileTitle' style='display:none;'>Titolo prova</div><div id='mobileBody' style='display:none;'>Corpo messaggio prova</div></body></html>";

 /* Using matches and aggregation */
 var matches = Regex.Matches(txt, rgx).Cast<Match>();
 /* Aggregation without using foreach*/
 if (matches != null && matches.Count() > 0)
 
    matches = matches.Where(x => !String.IsNullOrEmpty(x.Groups[1].Value));
    var exitString = matches.Select(x => x.Groups[1].Value).Aggregate((x, y) => x + "-" + y);
    Console.WriteLine("Match and aggregation");
    Console.WriteLine(exitString);
  

  /* using replace with regex: .*<div id='mobileTitle'[\s\w\W]*>([\s\w]*)<\/div>[\s\r\n]*<div id='mobileBody'[\s\w\W]*>([\s\w]*)<\/div>.* */
  Console.WriteLine();
  Console.WriteLine(@"Replace with another regex");
  Console.WriteLine(Regex.Replace(txt, @".*<div id='mobileTitle'[\s\w\W]*>([\s\w]*)<\/div>[\s\r\n]*<div id='mobileBody'[\s\w\W]*>([\s\w]*)<\/div>.*", "$1-$2"));

  Console.ReadLine();

【讨论】:

您好,感谢您的回复。如果在我使用该方法之前: Regex.Match(string, "your_regex");我有错误“无法识别的转义序列”。如果我在您的正则表达式之前放置一个@,则错误也是如此。我怎样才能消除错误? 我不知道为什么,但它也不起作用。我确实喜欢下面: var s = Regex.Matches(json, "

以上是关于c#正则表达式捕获两个字符串之间的字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

两个字符串之间的正则表达式匹配,包括那些字符串

在pyspark数据框的列中使用正则表达式捕获两个字符串之间的第一次出现的字符串

如何在 C# 中使用正则表达式解析重复的名称-值对

用于python的正则表达式来捕获两个XML标签之间的所有内容[重复]

C#初学者:删除字符串中两个字符之间的所有字符(正则表达式?)

c# 正则表达式捕获