我正在尝试针对此模式测试字符串:“至少一对方括号,换行两位,然后至少租用一个字符”。例如,[11][22][33]dd
应该匹配,而[11][22][33]
不应该匹配。
我已经尝试过此正则表达式:(\[\d{2}])+.+
。但是,当使用[11][22][33]
对它进行测试时,该测试应该失败了,它仍然可以通过该测试。第一个+
量词仅匹配两组[11]
和[22]
,而其余部分[33]
与.+
匹配。
我认为+
量词的“贪婪”行为会耗尽它所修改组的所有匹配段;但是,正则表达式引擎似乎会将“用尽所有匹配可能性”原则置于“贪婪量词”规则之上,而不是我期望的方式。
我应该如何实现我的目标?
(此问题实际上与语言无关,尽管标记为“golang”,这是我当前使用的语言。)
最佳答案
您可以使用
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则应返回true
value不为空(match[1] != ""
),否则返回false
。参见Go demo:
package main
import (
"fmt"
"regexp"
)
func main() {
strs := []string{
"[11][22][33]",
"___[11][22][33]",
"[11][22][33]____",
"[11][22]____[33]",
}
for _, str := range strs {
fmt.Printf("%q - %t\n", str, match(str))
}
}
var re = regexp.MustCompile(`(?:\[\d{2}])+(.*)`)
func match(s string) bool {
match := re.FindStringSubmatch(s)
if len(match) > 1 {
return match[1] != ""
}
return false
}
输出:
"[11][22][33]" - false
"___[11][22][33]" - false
"[11][22][33]____" - true
"[11][22]____[33]" - true
关于regex - Go中字符串末尾的正则表达式匹配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57653290/