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

现在,当然,我可以编写正则expression式来处理这两种情况,例如regexp.Compile("[a-zA-Z]") ,但是我的正则expression式是由用户给出的string构造的:

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

其中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])) } } 

但我觉得这是一个相当不雅的解决scheme。 速度并不是一个问题,但是我需要知道是否有另一种方法。

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

你可以通过在正则expression式的开头添加"(?i)"来实现。

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

对于一个固定的正则expression式,看起来像这样。

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

有关标志的更多信息,请search术语“标志”的语法文档 。

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

参考 。

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

你需要在你的正则expression式前加上(?i)

使用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 

标记语法是xyz(set)或-xyz(clear)或xy-z(set xy,clear z)。 标志是:

 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)