正则表达式只捕获[0-9]数字,同时用空格或逗号匹配数字

时间:2015-05-20 11:18:49

标签: c# .net regex parsing

我有一些类似的文字:

<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\>)

4 个答案:

答案 0 :(得分:5)

看起来你走错了方向。基本上,正则表达式is not the best tool用于解析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包也可以作为NuGet包安装在Visual Studio中。

答案 1 :(得分:3)

不能仅使用正则表达式执行此操作,但可以在两次传递中执行此操作,在每次传递中应用两个不同的正则表达式。

在第一次传递中,您只需匹配第二次传递中包含dots和/或spaces的数字,您使用正则表达式删除dotsspaces等并留下olnly数字

示例正则表达式:

第一遍:(?:\<\bspan\b.*?\bmyspan\b.*?\>)(?<numbers>[ ,.0-9]+)(?:\</\bspan\b\>)

第二遍:将匹配号码

上的空字符[ .,]替换为''

答案 2 :(得分:2)

编辑(灵感来自@ AndyKorneyev&#39;

使用HtmlAgilityPack,您可以通过查询具有<span>属性值的标记来获取所需的myspan标记。

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

<强> ORIGINAL

这是一种没有正则表达式的方法,使用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();

输出:

enter image description here

或者删除所有逗号和标记的非常奇怪的正则表达式方法:

 var result = Regex.Replace(txxt, @"(?><(?:\b|/)[^<]*>|,)", string.Empty);

结果为enter image description here

如果你出于某种原因坚持你的方法,只需使用环顾四周:

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();

答案 3 :(得分:1)

stribizhev的方法很好,当有更好的工具可用时,你不应该使用正则表达式来解析HTML / XML。至于只取数字,作为建议的p.Value.Replace(",", string.Empty)的替代,这里是一个使用LINQ的版本,并删除任何不是数字的东西:

new string(p.Value.Where(ch => char.IsDigit(ch)).ToArray())

这是有效的,因为string类实现了IEnumerable<char>