[英]C# Regex expression to match numbers, hyphens, colons, spaces and commas
[英]Regex to capture only [0-9] numbers while matching numbers with spaces or commas
我有一些类似的文字:
<span id="myspan">2,500</span>
<span id="myspan">500</span>
我需要一个正则表达式模式以仅匹配数字。 因此,以上匹配的输出为:
我已经试过了:
(?:\<\bspan\b.*?\bmyspan\b.*?\>)(?<numbers>[,0-9].*?)(?:\</\bspan\b\>)
和这个
(?:\<\bspan\b.*?\bmyspan\b.*?\>)(?<numbers>[0-9].*?)(?:\</\bspan\b\>)
看来您走错了路。 基本上,正则表达式不是解析HTML 的最佳工具 。
XML解析器有时可以应用,但并不总是可以应用,因为很多情况下html内容在xml方面格式不正确,因此xml解析器无法对其进行解析。
但是,使用Html Agility Pack很容易实现您的目标。
var s = "<span id=\"myspan\">2,500</span><span id=\"myspan\">500</span>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(s);
foreach (var node in doc.DocumentNode.ChildNodes.Where(n => n.Name == "span"))
{
string value = node.InnerHtml;
// here you can transform string value to integer and so on
Console.WriteLine(value);
}
注意:HTML Agility包也可以作为Visual Studio的NuGet包安装。
仅使用正则表达式是不可能做到这一点的,但是有可能在两次通过中都应用两次不同的正则表达式。
在第一遍中,您只需要匹配包含dots
和/或spaces
;在第二遍中,您可以使用正则表达式删除dots
, spaces
等,然后只保留数字
正则表达式示例:
第一遍: (?:\\<\\bspan\\b.*?\\bmyspan\\b.*?\\>)(?<numbers>[ ,.0-9]+)(?:\\</\\bspan\\b\\>)
第二次通过:将[ .,]
替换为匹配数字上的空字符''
编辑 (灵感来自@AndyKorneyev的答案):
使用HtmlAgilityPack,可以通过查询具有myspan
属性值的标签来获取所需的<span>
标签。
var txt = "<span id=\"myspan\">2,500</span><span id=\"myspan\">500</span>";
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(txt);
foreach (var node in doc.DocumentNode.ChildNodes.Where(p => p.Name == "span" && p.HasAttributes && p.GetAttributeValue("id", string.Empty) == "myspan"))
{
var val = node.InnerHtml;
Console.WriteLine(val.Replace(",", string.Empty));
}
输出:
2500
500
原文 :
这是一种不使用正则表达式的方法,使用XElement
和Replace
:
var txxt = "<span id=\"myspan\">2,500</span>\r\n<span id=\"myspan\">500</span>";
var Xelt = XElement.Parse("<root>" + txxt + "</root>");
var vals = Xelt.DescendantsAndSelf("span").Select(p => p.Value.Replace(",", string.Empty)).ToList();
输出:
或者使用一种非常奇怪的正则表达式方法来删除所有逗号和标记:
var result = Regex.Replace(txxt, @"(?><(?:\b|/)[^<]*>|,)", string.Empty);
结果是 。
如果出于某些原因坚持使用您的方法,请使用环顾四周:
var rgx = new Regex(@"(?s)(?<=<\bspan\b[^<]*?\bmyspan\b[^<]*?\>)(?<numbers>[,0-9]*?)(?=</span>)");
var matched = rgx.Matches(txxt).Cast<Match>().Select(p => p.Value.Replace(",", string.Empty)).ToList();
stribizhev的方法很好,当有更好的工具可用时,您不应使用正则表达式来解析HTML / XML。 至于仅取数字,作为提议的p.Value.Replace(",", string.Empty)
的替代方法p.Value.Replace(",", string.Empty)
这里是一个使用LINQ并删除非数字内容的版本:
new string(p.Value.Where(ch => char.IsDigit(ch)).ToArray())
这是有效的,因为string
类实现了IEnumerable<char>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.