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

Svi*_*vip 70 regex go

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

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

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]))
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*iel 146

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

您可以通过添加"(?i)"到正则表达式的开头来执行此操作.

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

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

r := regexp.MustCompile(`(?i)CaSe`)
Run Code Online (Sandbox Code Playgroud)

有关标志的更多信息,请在语法文档中搜索术语"标志".

  • 但是,当有很多数据时,我发现这太慢了.因为在regexp.Match中调用了unicode.SimpleFold,所以我建议将字母更改为upper,然后使用regexp进行匹配.这就是速度.以下是时间数据:``#By(?i)regexp忽略大小写XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/frameworks -f代码/框架1271.94s用户7.32s系统97%cpu 21:54.95总#By toUpper匹配XCMP/bin/otacmp -o BSP_2.2.0.html -f BSP/frameworks -f代码/框架263.87s用户8.99s系统110%cpu 4:06.44总``` (4认同)
  • 看起来不区分大小写的正则表达式性能缓慢是一个已知的错误,在接下来的几个月中已修复:https://github.com/golang/go/issues/13288 (2认同)

Qta*_*tax 23

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

参考.


Ada*_*her 6

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

你需要在你的正则表达式语句前加上前缀 (?i)


zzz*_*zzz 5

使用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
Run Code Online (Sandbox Code Playgroud)

标志语法是xyz(set)或-xyz(clear)或xy-z(设置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)
Run Code Online (Sandbox Code Playgroud)

  • 这个答案与文档一样无益.值得庆幸的是,下面有一个工作示例. (21认同)
  • 在代码中我应该把这些i,m,s和U放在哪里? (20认同)