Извлечь часть текста, используя RegEx - PullRequest
0 голосов
/ 10 июля 2009

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

2222 Main at King Edward Vancouver BC CA

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

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

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

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

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 июля 2009

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

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

Ex. regex1 = адрес # граббер, regex2 = граббер уличного типа, regex3 = граббер имен.

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

1 голос
/ 10 июля 2009

ну, я бы бросил свою шляпу на ринг:

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

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

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

  • 2222 Майн у короля Эдварда Ванкувера, Британская Колумбия, Калифорния, 333-333
  • 555 дорожное и уличное место CA US 95000
  • 2222 Майн у короля Эдуарда Ванкувера до н.э. CA 333
  • 555 дорожное и уличное место CA US

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

кстати: протестировано на regexhero.net

0 голосов
/ 10 июля 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...