正则表达式捕获的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
我想你忘记了单词分隔符('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