我有一句话,例如'这是[[被捕获的群体]]。捕获之间的单词数可以是1到5。
我想挑选两个括号(包括括号)之间的所有内容。我知道我可以使用像@"^.*(?<identifier>\[\[\.*\]\]).*$"
这样的东西,但我想尝试更精确,所以我认为这样可行:@"^.*(?<identifier>\[\[\w*(\b\w*){0,4}\]\]).*$"
任何人都可以看到为什么这不起作用?它捕获括号之间是否有一个单词但不是多个单词。我认为(\b\w*){0,4}
将允许0到4个单词。
谢谢,Bill N
答案 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