正则表达式:为什么每个找到的项目都没有组?

时间:2009-01-29 19:24:23

标签: c# regex

我有以下文字:

<i><b>It is noticeably faster.</b></i> <i><b>They take less disk space.</i>

以下正则表达式:

(</[b|i|u]>)+(\s*)(<[b|i|u]>)+

匹配会创建以下组:

0: </b></i>   <b><i>
1: </i>
2: spaces
3: <b>

如何更改我的正则表达式,以便创建类似的组:

0: </b></i>   <b><i>
1: </b>
2: </i>
3: spaces
4: <i>
3: <b>

4 个答案:

答案 0 :(得分:4)

我怀疑你已经得到了你需要的东西 - 你只需要枚举每组的捕获量。这是一个示例程序,显示了实际操作:

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        string text = 
"<i><b>It is noticeably faster.</b></i> <i><b>They take less disk space.</i>";
        Regex pattern = new Regex(@"(</[b|i|u]>)+(\s*)(<[b|i|u]>)+");

        Match match = pattern.Match(text);
        foreach (Group group in match.Groups)
        {
            Console.WriteLine("Next group:");
            foreach (Capture capture in group.Captures)
            {
                Console.WriteLine("  " + capture.Value);
            }
        }
    }
}

答案 1 :(得分:1)

你做不到。一个组只能拥有一个东西,即使它在同一个匹配中因为+,*或类似而击中多个东西。当然,您可以在该组中使用正则表达式或类似物来获取单个项目。

因此,每场比赛每组只有一件事。

答案 2 :(得分:0)

您只能更改正则表达式,以便匹配空格后面的每个结束标记和每个结束标记:

((?:</[biu]>)+)(\s*)((?:<[biu]>)+)

这将匹配

0: </b></i> <i><b>
1: </b></i>
2: _
3: <i><b>

答案 3 :(得分:0)

我发现这个网页http://regexlib.com/RETester.aspx对于测试RegEx表达式非常有用。它可以使用.Net引擎或客户端引擎来评估VBScript或JavaScript。

我喜欢这个来自RegExLib的在线工具,因为它可以在我所使用的任何机器上使用,但Jackson在UltraPico.com上的Expresso应用程序,杰克逊在对原始问题帖子的评论中建议,看起来不错。不仅仅是测试,它有助于构建您的RegEx。我刚刚下载了它,我将尝试一下。

现在,如果只有一个工具可以读取复杂的正则表达式,并提供一个自然的语言描述它应该做什么。特别是如果您可以指示您正在解析HTML或其他类型的数据格式,那么描述将根据使用情况进行定制。 :)