![](/img/trans.png)
[英]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.