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

标签 regex go regex-greedy

我正在尝试针对此模式测试字符串:“至少一对方括号,换行两位,然后至少租用一个字符”。例如,[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/

相关文章:

regex - 重复捕获组和懒惰问题

Python,循环文件的最佳方式,匹配模式后的两行然后加入它们

php - 正则表达式将图像中的空间更改为实体

带有服务帐户的 Google Reports API

go - 如何更高效/紧凑地编写此(详细)Golang 代码?

regex - R:gsub 和捕获

正则表达式信用卡号测试

PHP:preg_match 正则表达式找不到正确的字符串

Java正则表达式问题

go - 关于创建文件的权限,os.FileMode 的哪个组合对应于 fopen 中的 `a`?