How do I do a case insensitive regular expression in Go?

RegexGo

Regex Problem Overview


Now, of course, I could write my regular expression to handle both cases, such as regexp.Compile("[a-zA-Z]"), but my regular expression is constructed from a string given by the user:

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

Where s.Name is the name. Which could be something like 'North by Northwest'. Now, the most apparent solution to me would be to walk through each character of s.Name and write '[nN]' for each letter:

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

But I feel this is a rather non-elegant solution. Speed is not really a concern, but I need to know if there is another way.

Regex Solutions


Solution 1 - Regex

You can set a case-insensitive flag as the first item in the regex.

You do this by adding "(?i)" to the beginning of a regex.

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

For a fixed regex it would look like this.

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

For more information about flags, search the regexp/syntax package documentation (or the syntax documentation) for the term "flags".

Solution 2 - Regex

You can add a (?i) at the beginning of the pattern to make it case insensitive.

Reference

Solution 3 - Regex

I'm not too familiar with Go, but according to this example: http://play.golang.org/p/WgpNhwWWuW

You need to prefix your regex statement with (?i)

Solution 4 - Regex

Use the i flag. Quoting the tip documentation:

> Grouping:

(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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSvipView Question on Stackoverflow
Solution 1 - RegexDanielView Answer on Stackoverflow
Solution 2 - RegexQtaxView Answer on Stackoverflow
Solution 3 - RegexAdam PlocherView Answer on Stackoverflow
Solution 4 - RegexzzzzView Answer on Stackoverflow