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 = @".*(?<=>)(.+?)(?=).*?"; foreach (Match match in Regex.Matches(html, patten)) { Console.WriteLine(match.Groups[1].Value); }
我按照你的意愿更改了正则表达式,输出是
106.4% 106.2%
- entity framework5 MaxLength
- C#编译器错误:“结构中不能有实例字段初始化程序”
- 单个表列而不是整个实体的WCF数据服务权限
- 制作时钟UWP(C#)
- 如何在StackPanel或ListView中叠加项目?
- 溢出exception正在抛出 – 即使该值超出限制
- NHibernate存储库
- C#匿名实现接口(或抽象类)
- 使用枚举实现层次结构的最佳C#模式是什么?
Interesting Posts