Regex Go中字符串末尾的正则表达式匹配失败

Regex Go中字符串末尾的正则表达式匹配失败,regex,go,regex-greedy,Regex,Go,Regex Greedy,我试图根据这种模式测试一个字符串:“至少有一个方括号对,包含两个数字,后面至少有一个字符”。例如,[11][22][33]dd应该匹配,而[11][22][33]不应该匹配 我试过这个正则表达式:(\[\d{2}])+。+。但是,当使用本应失败的[11][22][33]对其进行测试时,它仍然通过了该测试。第一个+量词只匹配两组[11]和[22],而其余部分[33]由+匹配 我认为+量词的“贪婪”行为会耗尽它所修改的组的所有匹配段;然而,似乎正则表达式引擎将“耗尽所有匹配可能性”原则置于“贪婪量词

我试图根据这种模式测试一个字符串:“至少有一个方括号对,包含两个数字,后面至少有一个字符”。例如,
[11][22][33]dd
应该匹配,而
[11][22][33]
不应该匹配

我试过这个正则表达式:
(\[\d{2}])+。+
。但是,当使用本应失败的
[11][22][33]
对其进行测试时,它仍然通过了该测试。第一个
+
量词只匹配两组
[11]
[22]
,而其余部分
[33]
+
匹配

我认为
+
量词的“贪婪”行为会耗尽它所修改的组的所有匹配段;然而,似乎正则表达式引擎将“耗尽所有匹配可能性”原则置于“贪婪量词”规则之上,而不是我所期望的方式

我应该如何实现我的目标


(这个问题实际上是语言不可知的,尽管我现在使用的语言是“golang”。

你需要使用的正则表达式是这样的:

(\[[0-9]{2}\]){1,}[a-z]{1,}

您需要使用的正则表达式是这样的:

(\[[0-9]{2}\]){1,}[a-z]{1,}
你可以用

re := regexp.MustCompile(`(?:\[\d{2}])+(.*)`)
match := re.FindStringSubmatch(s)
if len(match) > 1 {
    return match[1] != ""
}
return false
(?:\[\d{2}])+(.*)
模式匹配1+次出现的
[
,2个数字,
]
,然后将除换行字符以外的任何0个或更多字符捕获到组1中。然后,如果找到匹配项(
if len(match)>1
),如果组1的值不为空(
match[1]!=”
),则应返回
true
),否则返回
false

见:

输出:

"[11][22][33]" - false
"___[11][22][33]" - false
"[11][22][33]____" - true
"[11][22]____[33]" - true
你可以用

re := regexp.MustCompile(`(?:\[\d{2}])+(.*)`)
match := re.FindStringSubmatch(s)
if len(match) > 1 {
    return match[1] != ""
}
return false
(?:\[\d{2}])+(.*)
模式匹配1+次出现的
[
,2个数字,
]
,然后将除换行字符以外的任何0个或更多字符捕获到组1中。然后,如果找到匹配项(
if len(match)>1
),如果组1的值不为空(
match[1]!=”
),则应返回
true
),否则返回
false

见:

输出:

"[11][22][33]" - false
"___[11][22][33]" - false
"[11][22][33]____" - true
"[11][22]____[33]" - true

只要一个否定的
[
(?:\[\d{2}])+[^[]
,就应该做这个工作。而且,正则表达式不是语言不可知的。@mkopriva如果'any character'部分不是
\w
字符,例如
[11][22][33]——dd
不匹配问题是,你想匹配
[11][22][33][此处的一些文本
?此处的问题是由回溯引起的,一旦模式不匹配,量化模式会让引擎回溯以找到另一种方法来匹配字符串,一旦路径成功,将返回匹配。拥有式量词和在lookaheads中捕获组(稍后使用回溯引用)在Go rege中不起作用x、 因此,解决这一问题的唯一方法是编写一个更精确的模式,但您需要精确的规则。只要一个否定的
[
(?:\[\d{2}])+[^[]
,就应该完成这项工作。此外,正则表达式不是语言不可知的。@mkopriva如果“任何字符”部分不是
\w
字符,则此项不匹配,例如
[11][22][33]---dd
不匹配问题是,是否要匹配
[11][22][33][此处的一些文本
?此处的问题是由回溯引起的,一旦模式不匹配,量化模式会让引擎回溯以找到另一种方法来匹配字符串,一旦路径成功,将返回匹配。拥有式量词和在lookaheads中捕获组(稍后使用回溯引用)在Go rege中不起作用x、 所以,解决这个问题的唯一方法是编写一个更精确的模式,但需要精确的规则。