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


84

现在,当然,我可以编写正则表达式来处理这两种情况,例如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]))
  }
}

但是我觉得这是一个不太优雅的解决方案。速度并不是真正的问题,但是我需要知道是否还有另一种方法。

Answers:


171

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

您可以通过添加"(?i)"到正则表达式的开头来实现。

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

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

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

有关标志的更多信息,请在 regexp/syntax软件包文档(或语法文档)中搜索术语“标志”。


4
但是,当有许多数据时,我发现这太慢了。由于在regexp.Match中调用unicode.SimpleFold,因此我建议将字母更改为upper,然后使用regexp进行匹配。这就是速度。以下是时间数据:```通过(?i)正则表达式忽略大小写XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / frameworks -f代码/ frameworks 1271.94s用户7.32s系统97%cpu 21:54.95总计#通过上边并匹配XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / frameworks -f代码/框架263.87s用户8.99s系统110%cpu 4:06.44全部`''
QJGui

1
大小写不敏感的regexp的性能降低似乎是一个已知的错误,已在以下月份修复:github.com/golang/go/issues/13288
Dan Esparza,

29

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

参考



4

使用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(设置)或-xyz(清除)或xy-z(设置xy,清除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)

22
我应该将这些i,m,s和U放在代码中的什么位置?
钱琛

25
该答案与文档一样无用。幸运的是,下面有一个有效的示例。
Laurent)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.