簡體   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