Шаг 39.
Язык программирования Go.
Примеры использования регулярных выражений
На этом шаге рассмотрим несколько примеров использования регулярных выражений в Go.
Задание 1. Преобразовать список имеющий вид: имя1...имяN фамилия,
в список, имеющий вид: фамилия, имя1...имяN. Результат выполнения программы представлен на рис.1:
Рис.1. Результат преобразования строк
Раскрыть/скрыть решение и комментарии.
Приведем пример, как
это можно реализовать с помощью пакета regexp, обеспечив корректную обработку символов с диакритическими знаками и других
национальных символов.
nameRx := regexp.MustCompile(`(\pL+\.?(?:\s+\pL+\.?)*)\s+(\pL+)`)
for i := 0; i < len(names); i++ {
names[i] = nameRx.ReplaceAllString(names[i], "${2}, ${1}")
}
Переменная names имеет тип []string и изначально хранит оригинальный список имен. По завершении цикла переменная names будет
хранить измененный список имен.
Регулярному выражению соответствует одно или более имен, разделенных пробельными символами, каждое из которых состоит из одной или более букв Юникода (\pL) с последующей необязательной запятой и фамилией из одной или более букв Юникода.
Архив примера можно взять здесь.
Использование нумерованных ссылок может привести к проблемам в процессе сопровождения, например если в середину вставить еще одну сохраняющую группу, тогда одна из ссылок окажется ошибочной. Решить эту проблему можно использованием именованных ссылок, которые не зависят от порядка следования соответствующих им именованных групп.
nameRx := regexp.MustCompile(`(?P<forenames>\pL+\.?(?:\s+\pL+\.?)*)\s
+(?P<surname>\pL+)`)
for i := 0; i < len(names); i++ {
names[i] = nameRx.ReplaceAllString(names[i],"${surname}, ${forenames}")
}
Здесь определены две сохраняющие группы с осмысленными именами. Это помогло сделать более очевидными регулярное выражение и строку замены со ссылками.
Архив примера можно взять здесь.
Задание 2. Подсчитать количество повторений слов в тектсе. Результат выполнения программы представлен на рис.2:
Рис.2. Результат подсчета повторений слов в тексте
Раскрыть/скрыть решение и комментарии.
Регулярному выражению соответствует один или более символов "слова". Функция regexp.Regexp.FindAllString() возвращает значение типа []string, содержащее все неперекрывающиеся совпадения. Если в испытуемой строке будет найдено хотя бы одно совпадение
(то есть переменная matches будет иметь значение, отличное от nil),
фрагмент выполнит итерации по срезу со строками и выведет все слова (без повторов) и количество их повторений в тексте.
wordRx := regexp.MustCompile(`\w+`)
if matches := wordRx.FindAllString(text, -1); matches != nil {
previous := ""
for _, match := range matches {
if match == previous {
...
fmt.Println("Слово: ", previous, " - повторяется ", i, "раз(а)")
...
}
}
Архив примера можно взять здесь.
На следующем шаге рассмотрим пример, иллюстрирующий применение стандартных пакетов Go для работы с изображениями.
Предыдущий шаг
Содержание
Следующий шаг