Как сделать регулярное выражение без учета регистра в 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 ответа:
вы можете установить флаг без учета регистра в качестве первого элемента в регулярном выражении.
Вы делаете это путем добавления
"(?i)"
к началу регулярного выражения.reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \._-]", -1))
для фиксированного регулярного выражения это будет выглядеть так.
r := regexp.MustCompile(`(?i)CaSe`)
для получения дополнительной информации о флагах, выполните поиск синтаксис документация термин "флаги".
Я не слишком знаком с 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)