Регулярное выражение MySQL не заменяет второе слово строки

#mysql #regex

#mysql #регулярное выражение

Вопрос:

Я пытаюсь удалить все экземпляры «universiti», «university», «university of», «college» и «college of» в моем запросе, но «university of» и «college of» заменяют только первое слово, а не второе, т.е. «of».

Это то, что я пробовал

 SELECT Name
, TRIM( REGEXP_REPLACE(Name, '(universiti|university|university\sof|college|college\sof)', '') ) AS re
FROM grid
 
 Name                                                                 |re                                                                   |
--------------------------------------------------------------------- --------------------------------------------------------------------- 
Australian National University                                       |Australian National                                                  |
Monash University                                                    |Monash                                                               |
University of Queensland                                             |of Queensland                                                        |
Macquarie University                                                 |Macquarie                                                            |
UNSW Sydney                                                          |UNSW Sydney                                                          |
Newcastle University                                                 |Newcastle                                                            |
University of Wollongong                                             |of Wollongong                                                        |
University of Melbourne                                              |of Melbourne                                                         |
University of Tasmania                                               |of Tasmania                                                          |
University of Adelaide                                               |of Adelaide                                                          |
James Cook University                                                |James Cook                                                           |
University of Western Australia                                      |of Western Australia                                                 |
University of Sydney                                                 |of Sydney                                                            |
Flinders University                                                  |Flinders                                                             |
 

Как я могу избавиться от «of» тоже?

Ответ №1:

Вы можете использовать

 SELECT Name,
  TRIM( REGEXP_REPLACE(Name, '\b(universit[yi]|college)(\s of\b\s*)?', '') ) AS re
FROM grid
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • b — граница слова
  • (universit[yi]|college) university , universiti , college
  • (s ofbs*)? — необязательная последовательность
    • s — один или несколько пробелов
    • of of слово
    • b — граница слова (так что of это не может быть префиксом более длинного слова)
    • s* — ноль или более пробелов.

Тестирование с

 create table grid (Name varchar(320));
insert into grid (Name) values ("University of Queensland");
insert into grid (Name) values ("Macquarie University");
insert into grid (Name) values ("UNSW Sydney");
 

вывод

введите описание изображения здесь