Regex (Posix), чтобы получить только первое слово, не включая цифры - PullRequest
1 голос
/ 28 июня 2019

Новое в Regex (которое недавно было добавлено в SQL в DB2 for i). Я ничего не знаю о различных движках, но исследования показывают, что он «основан на расширенных регулярных выражениях POSIX».

Я хотел бы получить название улицы (первое нечисловое слово) из адреса.

например.

101 Main Street = Main

2/b Pleasant Ave = Pleasant

5H Unpleasant Crescent = Unpleasant

Извините, у меня нет строки, которая не работает, как предложено программным обеспечением форума. Я даже не знаю с чего начать. Я попробовал несколько вещей, которые нашел в поиске, но они либо ничего не дали, либо первое «слово» - то есть число (101, 2 / b, 5H).

Спасибо

Редактировать: Хотя кажется, что реализация IBM регулярных выражений для семейства баз данных DB2 может быть слишком чуждой для многих экспертов-резидентов, я остановлюсь на некоторых подробностях, если это поможет .

Простая формулировка требования на английском языке:

Базовое / приемлемое: найти первое слово / непрерывную строку, которая не содержит цифр или специальных символов

Продвинутый / идеальный: найдите первое слово, которое содержит три или более символов, представляющих собой только буквы и ноль или один встроенный тире / дефис, но без цифр или других символов.

Дополнительные примеры (оригинальные в верхней части все еще действительны)

190 - 192 Tweety-bird avenue = Tweety-bird

190-192 Tweety-bird avenue = Tweety-bird

Charles Bronson Place = Charles

190H Charles-Bronson Place = Charles-Bronson

190 to 192 Charles Bronson Place = Charles

Второе редактирование: Перебираясь в интернете и пробуя каждое смутно связанное выражение, которое я смог найти, я наткнулся на вот это :

[a-zA-Z]+(?:[\s-][a-zA-Z]+)*

, который на самом деле работает довольно хорошо - он дает название улицы и тип улицы, которые при отражении на самом деле подойдут моей цели, а также только название улицы (я могу легко расширить общие сокращения - например, от RD до ROAD - на лету) ,

Пример SQL:

select HAD1,                                        
 regexp_substr(HAD1, '[a-zA-Z]+(?:[\s-][a-zA-Z]+)*')
from ECH                                            
where HEDTE > 20190601                              

Пример вывода

Ship To                                             REGEXP_SUBSTR      
Address                                                                
Line 1                                                                 
32 CHRISTOPHER STREET                               CHRISTOPHER STREET 
250 - 270 FEATHERSTON STREET                        FEATHERSTON STREET 
118 MONTREAL STREET                                 MONTREAL STREET    
7 BIRMINGHAM STREET                                 BIRMINGHAM STREET  
59 MORRISON DRIVE                                   MORRISON DRIVE     
118 MONTREAL STREET                                 MONTREAL STREET    
MASON ROAD                                          MASON ROAD         

Я знаю, что это был не совсем вопрос, который я задал, поэтому извиняюсь перед всеми, кто мог бы сделать это, но добросовестно выполнял первоначальный запрос.

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Не уверен, что это Posix-совместимый, но что-то вроде этого может работать: ^[\w\/]+?\s((\w+\s)+?)\s*\w+?$, пример здесь .

Сценарий предполагает, что первый фрагмент - это номер здания, второй - название улицы, а последний - Road/Ave/Blvd/etc.

Это также должно учитывать названия улиц, в которых есть пробелы.

0 голосов
/ 28 июня 2019

Использование следующего регулярного выражения соответствует вашим примерам:

(?<=[^ ]+ )[^ ]*[ ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...