C#正则表达式 – 获取第二个数字,而不是第一个

我有以下HTML代码:

106.2%  

我通过两个阶段获得了这个数字:

 Regex.Matches(html, "\\s*(.*?)\\s*", RegexOptions.Singleline); Regex.Match(m.Groups[1].Value, @"-?\d+.\d+").Value 

上面的代码行给了我想要的东西106.2

问题是有时HTML可能会有点不同,如下所示:

 106.4% 

在最后一种情况下,我只能获得107.2,我想获得106.4是否有一些正则表达技巧可以说,我希望句子中的第二个数字而不是第一个?

如果您拥有来自不同提供商的HTML代码,或者您当前的代码具有多个使用不同HTML格式样式的CMS,那么依赖正则表达式是不安全的。

我建议使用基于HtmlAgilityPack的解决方案:

 public string getCleanHtml(string html) { var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); return HtmlAgilityPack.HtmlEntity.DeEntitize(doc.DocumentNode.InnerText); } 

然后:

 var txt = "106.2% "; var clean = getCleanHtml(txt); txt = "106.4%"; clean = getCleanHtml(txt); 

结果: 在此处输入图像描述在此处输入图像描述

您不必担心格式化内部标记和任何XML / HTML实体引用。

如果您的文本是干净HTML字符串的子字符串,则可以使用Regex或任何其他字符串操作方法。

更新

您似乎需要

标记中的节点值。 这是一个方便的方法:

 private List GetTextFromHtmlTag(string html, string tag) { var result = new List(); HtmlAgilityPack.HtmlDocument hap; Uri uriResult; if (Uri.TryCreate(html, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp) { // html is a URL var doc = new HtmlAgilityPack.HtmlWeb(); hap = doc.Load(uriResult.AbsoluteUri); } else { // html is a string hap = new HtmlAgilityPack.HtmlDocument(); hap.LoadHtml(html); } var nodes = hap.DocumentNode.ChildNodes.Where(p => p.Name.ToLower() == tag.ToLower() && p.GetAttributeValue("class", string.Empty) == "previous"); // SelectNodes("//"+tag); if (nodes != null) foreach (var node in nodes) result.Add(HtmlAgilityPack.HtmlEntity.DeEntitize(node.InnerText)); return result; } 

你可以这样称呼它:

 var html = "0.9\n106.4%"; var res = GetTextFromHtmlTag(html, "td"); 

在此处输入图像描述

如果您只需要获取特定标签,

如果您的文本中包含数字,并且您只需要数字,则可以使用正则表达式:

 var rx = new Regex(@"[+-]?\d*\.?\d+"); // Matches "-1.23", "+5", ".677" 

见演示

试试XML方法

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Linq; namespace ConsoleApplication34 { class Program { static void Main(string[] args) { string input = "106.4%"; XElement element = XElement.Parse(input); string value = element.Descendants("span").Select(x => (string)x).FirstOrDefault(); } } } 

我想分享我为我的问题找到的解决方案。

所以,我可以使用以下HTML标签:

 0.9 106.4% 

或者更简单:

 51.4 

首先,我通过以下代码获取整行:

 MatchCollection mPrevious = Regex.Matches(html, "\\s*(.*?)\\s*", RegexOptions.Singleline); 

第二,我使用以下代码仅提取数字:

 foreach (Match m in mPrevious) { if (m.Groups[1].Value.Contains("span")) { string stringtemp = Regex.Match(m.Groups[1].Value, "-?\\d+.\\d+.\">-?\\d+.\\d+|-?\\d+.\\d+\">-?\\d+.\\d+|-?\\d+.\">-?\\d+|-?\\d+\">-?\\d+").Value; int indextemp = stringtemp.IndexOf(">"); if (indextemp <= 0) break; lPrevious.Add(stringtemp.Remove(0, indextemp + 1)); } else lPrevious.Add(Regex.Match(m.Groups[1].Value, @"-?\d+.\d+|-?\d+").Value); } 

首先我开始确定是否存在SPAN标记,如果存在,我将两个数字放在一起,并且我已经考虑了与正则表达式不同的可能性。 确定从哪里删除非重要信息的角色,并删除我不想要的内容。

它的工作完美。

谢谢大家的支持和快速解答。

 string html = @"106.4% 106.2% "; string patten = @".*(?<=>)(.+?)(?= 

我按照你的意愿更改了正则表达式,输出是

 106.4% 106.2%