簡體   English   中英

.NET正則表達式:如何獲取由兩個標簽包圍的文本

[英].NET Regular Expression: How to get a text enclosed by two tags

我正在使用ASP.NET,並且需要使用用戶鍵入的字符串進行管理以提取一些信息。 用戶輸入了正常的文本,單詞和數字,但有時他可能會在MATHML中鍵入數學表達式,這些表達式始終是標記包圍的xml字符串。 我想從鍵入的文本中提取每個數學段。 例如,讓我們考慮用戶鍵入以下文本:

string input = "My name is Dorry and here is a math expression: <math>---some math1---</math> ah, there is another expression: <math>---some math2---</math> and do not forget this too <math>---some math3---</math>.".

好吧,我想到的第一個正則表達式解決方案是這樣的:

string pattern1 = @"\<math(.+)\<\/math\>";

要獲得匹配,我顯然使用:

Regex r = new Regex(pattern1, RegexOptions.IgnoreCase);
string[] res = r.Matches(input);

它似乎工作正常,很糟糕,不是因為這個表達式,而是讓我得到一個由三個字符串(“ --- some math1 ---”,“ --- some math2-”組成的數組)(使用Reges.Matches) -“,” --- some math3 ---“); 它為我提供了一個僅包含一個元素的數組:“ ---一些math1 ---啊,還有另一個表達式:--- some math2 ---也不要忘記這一點--- some math3 ---”。 你知道嗎? 它需要第一個和最后一個,並在中間合並所有內容,而無需擔心其他任何元素或元素!

好吧,我想這是一個關於正則表達式的眾所周知的問題。 有解決方案嗎? 如何告訴正則表達式引擎多一點...知道嗎?

提前非常感謝您。

  1. 使用正則表達式匹配類似XML / HTML的標記通常是一個壞主意,而且容易出錯。 我不知道平衡組.NET正則表達式是否可以解決此問題,因此請注意。

  2. 您的問題之前已經咬過許多其他問題-默認情況下,正則表達式是貪婪的。 .+可以匹配所有內容(包括</math> ),因此它可以匹配整個輸入。 然后,由於正則表達式不完全匹配,因此它將開始回溯,直到正則表達式的其余部分可以匹配為止。 因此</math>子模式僅與最后一個結束標記匹配。 要使正則表達式不貪心,請添加? + (或* )之后。

如果使用的是.NET BCL Regex類,則應該能夠使用平衡組來實現所需的功能:

http://blog.stevenlevithan.com/archives/balancing-groups

您可以使用<math> [\\ s \\ S] *?</ math>正則表達式。 與您提供的示例字符串一起使用時效果很好。 它給了我3次比賽,如下所示:

<math> ---一些math1 --- </ math>

<math> ---一些math2 --- </ math>

<math> ---一些math3 --- </ math>

希望這就是您想要的。

快去

string pattern1 = @"\<math[\s\S]*?<\/math\>";
Regex r = new Regex(pattern1, RegexOptions.IgnoreCase);
MatchCollection res = r.Matches(input);

缺口

這是您需要的正則表達式:

  <math>.*?</math>

它與每對數學標記匹配。

如果開始標記可能包含屬性,請改用此正則表達式:

  <math\b[^><]*>.*?</math>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM