Как сделать регулярное выражение без учета регистра в Go?


теперь, конечно, я мог бы написать свое регулярное выражение для обработки обоих случаев, таких как 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]))
  }
}

но я чувствую, что это довольно неэлегантное решение. Скорость на самом деле это не проблема, но мне нужно знать, есть ли другой способ.

4 58

4 ответа:

вы можете установить флаг без учета регистра в качестве первого элемента в регулярном выражении.

Вы делаете это путем добавления "(?i)" к началу регулярного выражения.

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

для фиксированного регулярного выражения это будет выглядеть так.

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

для получения дополнительной информации о флагах, выполните поиск синтаксис документация термин "флаги".

вы можете добавить (?i) в начале картины, чтобы сделать его нечувствительным к регистру.

ссылка.

Я не слишком знаком с Go, но в соответствии с этим примером:http://play.golang.org/p/WgpNhwWWuW

вам нужно префикс вашего оператора regex с (?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 (набор) или АБВ (очистить) или XY-з (комплект из ху, ясно, з). Флаги:

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)