如何在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)