Захват каждой группы слов между '-' - PullRequest
2 голосов
/ 05 февраля 2020

Мне нужно извлечь группу слов из столбца в базе данных. Пользователи сохранили конечную линию шины довольно неприятным способом, и мне нужно их извлечь.
Например:

'Bétheny La Couturelle - Croix Cordier - Tinqueux Champ Paveau'  
- {Bétheny La Couturelle}  
- {Croix Cordier}    
- {Tinqueux Champ Paveau}  

Я пробовал этот шаблон:

,'([a-zA-Zéèàîùê]+(\s|\-)?)+', 'g');

Например:

select regexp_matches('Bétheny La Couturelle - Croix Cordier - Tinqueux Champ Paveau','([a-zA-Zéèàîùê]+(\s|\-)?)+','g')````  

Флаг 'g' для захвата всех совпадений. Но это не работает.
Все, что я получил, было:

- {e , }  
- {r , }  
- {u,NULL}  

Как мне добиться успеха?
Заранее спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

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

SELECT regexp_matches('Bétheny La Couturelle - Croix Cordier - Tinqueux Champ Paveau','[a-zA-Zéèàîùê]+(?:[\s-][a-zA-Zéèàîùê]+)*','g')

См. онлайн-демонстрацию .

Или, если разделитель всегда <spaces><-><spaces>, вы можете использовать метод разделения:

SELECT regexp_split_to_table('Bétheny La Couturelle - Croix Cordier - Tinqueux Champ Paveau', '\s+-\s+')

См. еще одну демонстрацию .

Детали шаблона

  • [a-zA-Zéèàîùê]+ - 1 или более букв в класс символов
  • (?:[\s-][a-zA-Zéèàîùê]+)* - 0 или более последовательностей
    • [\s-] - пробел или - (обратите внимание, что это эквивалентно [[:space:]-])
    • [a-zA-Zéèàîùê]+ - 1 или более букв в классе символов.

В коде разбиения \s+-\s+ соответствует 1+ пробелам, - и снова 1+ пробелам.

Результат:

enter image description here

...