Как я могу сделать нечувствительное к регистру регулярное выражение в 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]))
}
}
Но я считаю, что это довольно не элегантное решение. Скорость на самом деле не вызывает беспокойства, но мне нужно знать, есть ли другой способ.
Ответы
Ответ 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)