2009-07-09 6 views
0

Я хотел бы извлечь часть текста, используя регулярное выражение. Так, например, у меня есть адрес и хочу вернуть только номер и улицу и исключить остальные:Извлечь часть текста с помощью RegEx

2222 Main at King Edward Vancouver BC CA 

Но адрес изменяется в формате большой части времени. Я попытался с помощью просмотра назад Regex и вышел с этим выражением:

.*?(?=\w* \w* \w{2}$) 

Приведенные выше выражения обрабатывает выше пример хорошо, но тогда он получает слишком грязный, как только запятые приходят в текст, почтовые индексы, которые могут быть 6 символьная строка или две строки из 3 символов с пространством посередине и т. д.

Есть ли более элегантный способ извлечения части текста, кроме регулярного выражения lookbehind?

Любое предложение или точка в другом направлении очень ценится.

Спасибо!

+1

FYI, это взгляд, который вы используете, а не на вид. –

+0

Спасибо! Я это запомню. – Jaime

ответ

2

Регулярные выражения предназначены для данных, которые являются РЕГУЛЯРНЫМИ, что следует за шаблоном. Поэтому, если ваши данные абсолютно случайны, нет, нет элегантного способа сделать это с помощью регулярного выражения.

С другой стороны, если вы знаете, какие значения вы хотите, вы, вероятно, можете написать несколько простых регулярных выражений, а затем просто проверить их все на каждой строке.

Ex. regex1 = адрес # граббер, regex2 = улица type граббер, regex3 = name граббер.

Попытка совпадения с string1 с regex1, regex2 и, наконец, regex3. Перейдите к следующей строке.

+0

Вот что я подумал. Ну, я думаю, мне нужно пойти на грязные вещи. Спасибо, Райан! – Jaime

1

хорошо я Тота я бы бросить свою шляпу в кольцо:

.*(?=,? ([a-zA-Z]+,?\s){3}([\d-]*\s)?)

и вы можете ^ или \d+ на передней панели для хорошей мерой
и я не потрудился указания длины для почтовые коды ... просто любое количество символов дефисов в этом.

это работает для этих входов до сих пор и вариации на запятые в пределах района/штата/страны Город:

  • 2222 Main в King Edward Vancouver, BC, CA, 333-333
  • 555 дороги и улицы место CA США 95000
  • 2222 Main в King Edward Vancouver BC CA 333
  • 555 дороги и улицы место CA США

он рассчитывает, что в конце есть три слова для города, штата и страны, но кроме этого это похоже на ryansstack, если это случайное, это не сработает. если в городе два слова, как Нью-Йорк, это не сработает. да ... regex не является инструментом для этого.

btw: проверено на regexhero.Чистая

+0

Спасибо, Виктор! Я попытаюсь проверить его с большим количеством данных на моем конце. – Jaime

+0

Может кто-нибудь отправить JSFiddle? – 2012-12-29 20:47:41

0

я могу думать 2 способами вы можете сделать это

1), если вы знаете, что «остальные» ваших данных после адреса ровно два поля, т.е. BC и CA, вы можете сделать разделить на ваша строка использует пробел как разделитель, удалите последние 2 элемента.

2) выполните разделение на разделитель/[A-Z] [A-Z]/и сохраните результат в массиве. затем распечатайте массив (это указано, что адрес не содержит двух или более заглавных букв)

+0

Спасибо за ввод. Ценить это! – Jaime