我正在使用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);
它似乎工作,太糟糕了,它不是因为这个表达式,而不是让我一个数组(使用Reges.Matches)填充三个字符串(“--- some math1 ---”,“---一些math2 ---“,”---一些math3 ---“);它只给我一个只有一个元素的数组:“---一些math1 ---啊,还有另一个表达式:---一些math2 ---并且不要忘记这一点---一些math3 ---”。你能看到吗你能明白吗?它需要第一个和最后一个并且合并中间的所有东西而没有关注其他一些或元素的方式!
好吧,我想这是一个关于正则表达式的众所周知的问题;有解决方案吗?如何告诉正则表达式引擎更多...知道吗?
非常感谢你。
答案 0 :(得分:1)
使用正则表达式来匹配类似XML / HTML的标签通常是一个坏主意并且非常容易出错。我不知道平衡组.NET正则表达式是否提供了解决方案,所以请注意。
你的问题之前已经咬过很多其他人 - 默认情况下正则表达式是贪婪的。 .+
可以匹配所有内容(包括</math>
),因此它匹配整个输入。然后,因为正则表达式完全不匹配,所以它开始回溯,直到正则表达式的其余部分匹配。因此</math>
子模式仅匹配最后一个结束标记。要使正则表达式非贪婪,请在?
之后添加+
(或*
。
答案 1 :(得分:0)
如果您正在使用.NET BCL Regex类,那么您应该能够使用平衡组来实现所需:
答案 2 :(得分:0)
您可以使用&lt; math&gt; [\ s \ S] *?&lt; / math&gt;正则表达式。它与您提供的示例字符串一起工作正常。 它给了我3场比赛如下:
&lt; math&gt; ---一些math1 ---&lt; / math&gt;
&lt; math&gt; ---一些math2 ---&lt; / math&gt;
&lt; math&gt; ---一些math3 ---&lt; / math&gt;
我希望这是你想要的。
答案 3 :(得分:0)
放手一搏......
string pattern1 = @"\<math[\s\S]*?<\/math\>";
Regex r = new Regex(pattern1, RegexOptions.IgnoreCase);
MatchCollection res = r.Matches(input);
尼克
答案 4 :(得分:0)
这是你需要的正则表达式:
<math>.*?</math>
它匹配每对数学标记。
如果开始标记可能包含属性,请改用此正则表达式:
<math\b[^><]*>.*?</math>