正则表达具有1到5个ords的捕获组

时间:2011-04-18 21:09:00

标签: c# regex

我有一句话,例如'这是[[被捕获的群体]]。捕获之间的单词数可以是1到5。

我想挑选两个括号(包括括号)之间的所有内容。我知道我可以使用像@"^.*(?<identifier>\[\[\.*\]\]).*$"这样的东西,但我想尝试更精确,所以我认为这样可行:@"^.*(?<identifier>\[\[\w*(\b\w*){0,4}\]\]).*$"

任何人都可以看到为什么这不起作用?它捕获括号之间是否有一个单词但不是多个单词。我认为(\b\w*){0,4}将允许0到4个单词。

谢谢,Bill N

4 个答案:

答案 0 :(得分:3)

我认为你忘了单词分隔符(\s):

^.*(?<identifier>\[\[\w+(\s+\b\w+){0,4}\]\]).*$

答案 1 :(得分:2)

你的问题在这里:

(\b\w*){0,4}

由于您未允许使用空格,因此无效。将其更改为:

(\s+\b\w*){0,4}

这将捕获空格,但您可以轻松地进行后期处理(使用Trim())。

答案 2 :(得分:0)

您创建了多个捕获的组,每个支架一个。试试这个:

@"^.*(?<identifier>\[\[\w*(?:\s\w*){0,4}\]\]).*$"

(?:)这是一个非捕获组,它不会创建变量,因此您的结果仍然在命名组中。

更新:当然,正如其他两个答案所指出的那样,您的主要问题是缺少\s我也将此添加到我的解决方案中。

Update2:添加\b时不需要\s,因此已删除。

答案 3 :(得分:0)

我的偏好是这样的(未经测试):

^[^\[]*(?<identifier>\[\[\s*(\w+(?:\s+|(?=\]))){1,5}\]\])[\S\s]*$

^                           # begin of string
 [^\[]*                      # some optional not '[' chars
 (?<identifier>              # <ID> begin
    \[\[                        # '[['
         \s*                             # some optional whitespace
         (?:\w+ (?:\s+|(?=\])) ){1,5}    # 1-5 words separated by spaces
    \]\]                        # ']]'
 )                           # end <ID>
 [\S\s]*                     # some optional any chars
$ 
                     # end of string