![](/img/trans.png)
[英].Net Regular Expression to get parenthetical text at end of <p> tags
[英].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 ---”。 你知道嗎? 它需要第一個和最后一個,並在中間合並所有內容,而無需擔心其他任何元素或元素!
好吧,我想這是一個關於正則表達式的眾所周知的問題。 有解決方案嗎? 如何告訴正則表達式引擎多一點...知道嗎?
提前非常感謝您。
使用正則表達式匹配類似XML / HTML的標記通常是一個壞主意,而且容易出錯。 我不知道平衡組.NET正則表達式是否可以解決此問題,因此請注意。
您的問題之前已經咬過許多其他問題-默認情況下,正則表達式是貪婪的。 .+
可以匹配所有內容(包括</math>
),因此它可以匹配整個輸入。 然后,由於正則表達式不完全匹配,因此它將開始回溯,直到正則表達式的其余部分可以匹配為止。 因此</math>
子模式僅與最后一個結束標記匹配。 要使正則表達式不貪心,請添加?
在+
(或*
)之后。
如果使用的是.NET BCL Regex類,則應該能夠使用平衡組來實現所需的功能:
您可以使用<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.