问题描述
|
我有一个类似\'这是[[一个捕获的组]]的句子。\'捕获之间的单词数可以是1到5。
我想挑出两个括号之间的所有内容(包括括号)。我知道我可以使用类似“ 0”的方法,但是我想尝试更精确一些,所以我认为这会起作用:“ 1”
谁能看到为什么这行不通?它捕获方括号之间是否只有一个单词,但不包含多个单词。我认为the2ѭ可以再增加0到4个字。
谢谢,比尔·N
解决方法
您创建了一个以上的捕获组,每个括号一个。尝试这个:
@\"^.*(?<identifier>\\[\\[\\w*(?:\\s\\w*){0,4}\\]\\]).*$\"
(?:)
这是一个非捕获组,不会创建变量,因此您的结果仍在命名组中。
更新:当然,正如其他两个答案所指出的那样,您的主要问题是缺少的“ 5”字,我也将此添加到了解决方案中。
更新2:添加ѭ5时,不需要\\b
,因此将其删除。,我想您会忘记字距表(\\s
):
^.*(?<identifier>\\[\\[\\w+(\\s+\\b\\w+){0,4}\\]\\]).*$
,您的问题在这里:
(\\b\\w*){0,4}
由于您不允许使用空格,因此无法使用。更改为:
(\\s+\\b\\w*){0,4}
这将捕获空间,但是您可以轻松地进行后处理(使用Trim()
)。,我的偏好是这样的(未经测试):
^[^\\[]*(?<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