【问题标题】:RegEx to get text within tags正则表达式获取标签内的文本
【发布时间】:2008-12-09 16:10:38
【问题描述】:

我需要一个Regular Expressions 来获取 2 个标签内的文本。

假设我希望返回一个数组,其中包含 <data> 和 </data> 标记中的任何文本。 或任何在“(”和“)”标签内的文本。

如何使用 C# 中的 RegEx 来做到这一点?


一个高级问题是:

  1. 输入字符串是"color=rgb(50,20,30)"
  2. 如何获得由 C# 中的 RegEx 处理器返回的 3 个单独数组槽中的 3 个数字?

【问题讨论】:

标签: regex string


【解决方案1】:

Perl 正则表达式是

$string =~ /color=rgb\((\d+),(\d+),(\d+)\)/;
@array = ($1,$2,$3);

但您可能需要更多信息。

【讨论】:

    【解决方案2】:

    由于您特别提到了 C#,所以我是这样进行精确解析的:

    private static readonly Regex RgbValuePattern = new Regex(@"(?<r>\d{1,3}) ?, ?(?<g>\d{1,3}) ?, ?(?<b>\d{1,3})",
                                                              RegexOptions.Compiled | RegexOptions.ExplicitCapture);
    

    以后……

    var match = RgbValuePattern.Match(value);
    
    if (match.Success)
    {
        int r = Int32.Parse(match.Groups["r"].Value, NumberFormatInfo.InvariantInfo);
        int g = Int32.Parse(match.Groups["g"].Value, NumberFormatInfo.InvariantInfo);
        int b = Int32.Parse(match.Groups["b"].Value, NumberFormatInfo.InvariantInfo);
        return Color.FromArgb(r, g, b);
    }
    

    【讨论】:

    • 啊!这让我想起了为什么我在 C++ 中避免使用正则表达式——使用起来非常尴尬! Perl 仍然是最好的语言...
    【解决方案3】:

    这个类似问题的答案会有所帮助:

    【讨论】:

      【解决方案4】:

      使用 Regex 解析 XML 通常是一个非常糟糕的主意。见this answer

      【讨论】:

        【解决方案5】:

        我相信当你想要解析嵌套结构时会出现真正的问题。例如,当您想像这样检查 XML &lt;data&gt;&lt;data&gt;123&lt;/data&gt;&lt;data&gt;456&lt;/data&gt;&lt;/data&gt; 要提取包含在最外层 &lt;data&gt; 标记中的数据,仅靠一个 RegEx 是不够的。只是警告您不要在存在更多(强大和特定)方法的地方使用 RegEx。在对 XML 执行更复杂的任务时,应考虑使用真正的 XML 解析器。我的 2 美分...

        【讨论】:

        • 是的,正则表达式以不处理递归数据而闻名。实际上理论上是做不到的。
        • 是的,你是对的。您可以匹配有限递归(例如 3 个并且没有更多的嵌套标签),但不能解决任意级别的递归问题。有限自动机无法跟踪到达任何递归级别所需的无限步数。
        • 最近发现了 .NET 正则表达式的一个有趣特性——平衡匹配(参见blogs.msdn.com/bclteam/archive/2005/03/15/396452.aspx)。因此,有了这样的功能,您实际上 可以 匹配括号。让我有点意外……
        猜你喜欢
        • 2017-07-24
        • 1970-01-01
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        相关资源
        最近更新 更多