繁体   English   中英

正则表达式仅在捕获带有空格或逗号的数字时捕获[0-9]个数字

[英]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>

我需要一个正则表达式模式以仅匹配数字。 因此,以上匹配的输出为:

  • 2500
  • 500

我已经试过了:

(?:\<\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 ;在第二遍中,您可以使用正则表达式删除dotsspaces等,然后只保留数字

正则表达式示例:

第一遍: (?:\\<\\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

原文

这是一种不使用正则表达式的方法,使用XElementReplace

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM