2013-06-28 3 views
2

Я работаю над написанием некоторого регулярного выражения в Postgres, чтобы отфильтровать часть мусора в моих строках. Вот некоторые из различных случаев, с которыми я сталкиваюсь:Регулярное выражение соответствует следующему варианту вещей

AUTO PARTS STORE 15 
AUTO PARTS STORE #15 
AUTO PARTS STORE #A15 
AUTO PARTS STORE #AB15 
AUTO PARTS STORE #A 15 
AUTO PARTS STORE #A A15 
AUTO PARTS STORE #15A 
AUTO PARTS STORE #15-15 

Число после # может быть одним или несколькими. Кроме того, между «STORE» и «#» не должно быть пробелов.

То, что я пытаюсь фильтровать, - это «МАГАЗИН» и любой номер магазина после того, как он отформатирован.

До сих пор, это то, что я разработал:

select regexp_replace(estab_name,E'STORE (#)?()?([A-Z])?([A-Z])?()?\\d+\\Z',' ') 

Вот пример некоторых случаях я отсутствующими, и то, что я хотел бы вернуться (примечание - это третья сторона редактирования на основе комментариев - показать О.П., что я думаю, что он имел в виду, и приглашающие поправки):

If the input string is:    I would like to remove: I would like to return: 
7-ELEVEN FOOD STORE #11150A   STORE #11150A    7-ELEVEN FOOD 
7-ELEVEN FOOD STORE #20132C   STORE #20132C    7-ELEVEN FOOD 
7-ELEVEN FOOD STORE #2306-2134  STORE #2306-2134    7-ELEVEN FOOD 
7-ELEVEN STORE #2301-14410N   STORE #2301-14410N   7-ELEVEN 
7-ELEVEN STORE # 14279B TODD BAXTER STORE # 14279B TODD BAXTER 7-ELEVEN 
84 LUMBER COMPANY, LP, STORE: #0922 STORE: #0922     84 LUMBER COMPANY, LP, 
BIG LOTS STORE# 1886     STORE# 1886     BIG LOTS 
KROGER STORE J-978     STORE J-987     KROGER 

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

+0

Не могли бы вы показать, что вы ожидаете выход должен быть? Например, для '7-ELEVEN STORE # 2301-14410N', вы хотите« МАГАЗИН № 2301 »,« МАГАЗИН 2301 »,« МАГАЗИН 2301-14410 », ...? – Floris

+0

Несомненно, не проблема. Я ищу удалить любую информацию о магазине и номере. Таким образом, из приведенных выше примеров: 7-Eleven продовольственного магазина # 11150A 7-Eleven FOOD 7-ОДИННАДЦАТЬ продовольственного магазин # 20132C 7-Eleven FOOD 7-Eleven продовольственного магазина # 2306-2134 7-Eleven FOOD 7-Eleven STORE # 2301-14410N 7-оДИННАДЦАТЬ 7-оДИННАДЦАТЬ МАГАЗИН # 14279B ТОДД БАКСТЕР 7-оДИННАДЦАТЬ 4 Lumber Company, LP, МАГАЗИН: # 0922 84 ПИЛОМАТЕРИАЛА Company, LP, БОЛЬШОЙ ПАРТИЯ STORE # 1886 BIG ПАРТИИ Kroger МАГАЗИН J-978 KROGER – SBaha

+0

Извините, у меня возникли проблемы с добавлением перерывов в строке. – SBaha

ответ

3

Из примеров, показанных конечно, вы только после того, как:

STORE ?:? ?#?[A-Z0-9 -]+$ 
+0

Технически черта должна идти в передней части набора символов, в противном случае она должна находиться между двумя символами. – Raceimaztion

+1

@Raceimaztion нет так. Литеральная тире может быть первой или последней. – Bohemian

+0

Действительно? Я давно прочитал противоположное и застрял с тех пор - есть ли особая причина? Как бы не возникало никаких ошибок из-за их наличия в конце? Я рад изменить его, хотя, если это действительно плохая практика по каким-либо причинам – SmokeyPHP

0

использования \ б для слова boundries

\bSTORE.* 
0

Если моя интерпретация того, что вы спрашиваете, правильно, то, что вы попытка совпадения - это «все после слова« STORE »до конца строки». В этом случае ваше регулярное выражение просто

STORE.*$ 

Вы можете увидеть это в действии на http://rubular.com/r/05sNzmXdqS. Если моя интерпретация в обратном направлении, и вы хотите, чтобы соответствовать «все перед словом STORE», то ваш регулярное выражение

^.*(?=STORE) 

Использование «предпросмотр», чтобы сказать «все, вплоть до, где символы справа от вас являются„STORE“ . вы можете увидеть это на работе в http://rubular.com/r/7Up8vVwzZa

Если вам нужно пространство перед «STORE», чтобы быть устранены, а я уверен, что вы можете выяснить, как изменить выражение.