如何在 Go 中执行不区分大小写的正则表达式?

我可以编写正则表达式来处理这两种情况,比如 regexp.Compile("[a-zA-Z]"),但是我的正则表达式是由用户给出的字符串构造的:

reg, err := regexp.Compile(strings.Replace(s.Name, " ", "[ \\._-]", -1))

其中 s.Name是名称。可能是“北西北”。现在,对我来说,最明显的解决方案是遍历 s.Name的每个字符,并为每个字母写上“[ nN ]”:

    for i := 0; i < len(s.Name); i++ {
if s.Name[i] == " " {
fmt.Fprintf(str, "%s[ \\._-]", str);
} else {
fmt.Fprintf(str, "%s[%s%s]", str, strings.ToLower(s.Name[i]), strings.ToUpper(s.Name[i]))
}
}

但我觉得这是一个相当不优雅的解决方案。速度不是问题,但我想知道有没有别的办法。

92845 次浏览

您可以在模式的开头添加一个 (?i),使其不区分大小写。

参考文献

我不太熟悉围棋,但是根据这个例子: http://play.golang.org/p/WgpNhwWWuW

您需要在正则表达式语句前面加上 (?i)

可以将不区分大小写的标志设置为正则表达式中的第一项。

为此,可以将 "(?i)"添加到正则表达式的开头。

reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \\._-]", -1))

对于一个固定的正则表达式,它看起来是这样的。

r := regexp.MustCompile(`(?i)CaSe`)

有关标志的更多信息,请搜索 regexp/syntax 软件包文档 (或 语法文档) “旗帜”这个词。

使用 i标志。引用提示 文件:

分组:

(re)           numbered capturing group
(?P<name>re)   named & numbered capturing group
(?:re)         non-capturing group
(?flags)       set flags within current group; non-capturing
(?flags:re)    set flags during re; non-capturing

Flag syntax is xyz (set) or -xyz (clear) or xy-z (set xy, clear z). The flags are:

i              case-insensitive (default false)
m              multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
s              let . match \n (default false)
U              ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)