正则表达式捕获的1 ~ 5个单词的组

本文关键字:5个 单词 正则表达式 | 更新日期: 2023-09-27 17:50:35

我有一个句子,像'这是[[捕获组]]]。捕获的单词之间的字数可以是1到5。

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

有人知道为什么这不起作用吗?它会捕获括号之间是否有一个单词,而不是多个单词。我以为('b'w*){0,4}会允许多写0到4个单词。

谢谢,Bill N

正则表达式捕获的1 ~ 5个单词的组

我想你忘记了单词分隔符('s):

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

你的问题在这里:

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

这不起作用,因为您不允许空格。改为:

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

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

创建多个捕获组,每个括号一个。试试这个:

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

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

更新:当然,正如其他两个答案所指出的,你的主要问题是缺少's,我也把它添加到我的解决方案中。

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

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

^[^'[]*(?<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