【问题标题】:.NET Regular Expression: How to get a text enclosed by two tags.NET 正则表达式:如何获取由两个标签包围的文本
【发布时间】:2010-10-14 08:00:22
【问题描述】:

我正在使用 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---”,“---一些数学2---", "---一些数学3---");它给我一个只有一个元素的数组:“---some math1--- 啊,还有另一个表达式:---some math2--- 不要忘记这个---some math3---”。你知道吗?它需要第一个和最后一个,并在中间合并所有内容,而不关心其他一些元素!

好吧,我想这是关于正则表达式的一个众所周知的问题;有解决办法吗?如何告诉正则表达式引擎更...意识?

非常感谢您。

【问题讨论】:

  • 用正则表达式解析 XML?很痛:stackoverflow.com/questions/1732348/…
  • 是的,你是对的,但在这里我没有一个格式良好的 xml 树,在这里我必须使用由一些 xml 段组成的混合结构来管理,这些 xml 段像盐和胡椒一样分布在整个地方......

标签: .net asp.net regex pattern-matching


【解决方案1】:
  1. 使用正则表达式匹配 XML-/HTML-like 标签通常是个坏主意,而且很容易出错。我不知道 .NET 正则表达式提供的平衡组是否可以解决这个问题,所以请注意。

  2. 您的问题之前已经困扰了许多其他问题 - 默认情况下,正则表达式是贪婪的。 .+ 可以匹配所有内容(包括&lt;/math&gt;),因此它匹配整个输入。然后,因为正则表达式没有完全匹配,它开始回溯,直到正则表达式的其余部分可以匹配。所以&lt;/math&gt; 子模式只匹配最后一个结束标签。要使正则表达式不贪婪,请在 + 之后添加 ?(或 *)。

【讨论】:

  • 嗯,我找到了一个正确的模式......关于你所说的......我会意识到它并进行更多研究,以更好地了解正则表达式在哪里被认为是一个好的解决方案和一个好的实践.感谢您的信息
【解决方案2】:

试一试..

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

尼克

【讨论】:

    【解决方案3】:

    如果您使用的是 .NET BCL Regex 类,您应该能够使用平衡组来实现您所需要的:

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

    【讨论】:

      【解决方案4】:

      您可以使用 [\s\S]*? 正则表达式。它适用于您提供的示例字符串。 它给了我3场比赛如下:

      ---一些数学1---

      ---一些数学2---

      ---一些数学3---

      我希望这是你想要的。

      【讨论】:

        【解决方案5】:

        这是您需要的正则表达式:

          <math>.*?</math>
        

        它匹配每一对 ma​​th 标签。

        如果开始标签可能包含属性,请改用此正则表达式:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-23
          • 1970-01-01
          • 1970-01-01
          • 2011-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多