Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Вы можете установить флаг, не учитывающий регистр, как первый элемент в регулярном выражении.

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

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

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

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

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

Ответ 2

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

Ссылка.

Ответ 3

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

Вам нужно прикрепить оператор regex к (?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 (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)