Соответствующие условия в регулярном выражении - PullRequest
1 голос
/ 30 декабря 2011

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

Допустим, у меня есть название улицы, например, 23-я или 5-я улица. Я бы хотел избавиться от следующих слов "th", "rd", "nd" и "st". Как это можно сделать?

Прямо сейчас у меня есть выражение: (st | nd | rd | th). Проблема в том, что он также будет соответствовать названиям улиц, которые содержат "st", "nd", "rd" или "th". Так что мне действительно нужно условное совпадение, которое ищет минимум одно число перед собой (т. Е. 1-е, а не улицу).

Спасибо!

Ответы [ 4 ]

5 голосов
/ 30 декабря 2011

Звучит так, будто вы просто хотите сопоставить порядковый суффикс (st | nd | rd | th), да?

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

/(?<=\d)(st|nd|rd|th)/

Соответствует (st|nd|rd|th), только если ему предшествует цифра \d, но совпадение не захватывает саму цифру.

2 голосов
/ 30 декабря 2011

То, что вы действительно хотите - это якоря.

Попробуйте глобально заменить:

\b(\d+)(?:st|nd|rd|th)\b

на первую группу.

Объяснение:

  • \b -> соответствует позиции , где либо за символом слова (цифра, буква, подчеркивание) следует символ без слова (ни одной из предыдущей группы), либо наоборот;
  • (\d+) -> соответствует одной или нескольким цифрам и фиксирует их в первой группе ($ 1);
  • (?:st|nd|rd|th) -> соответствует любому из st и т. Д. без захвата ((?:...) - группа без захвата);
  • \b -> см. Выше.

Демонстрация с использованием perl:

$ perl -pe 's/\b(\d+)(?:st|nd|rd|th)\b/$1/g' <<EOF
> Mark, 23rd street, New Hampshire
> I live on the 7th avenue
> No match here...
> azoiu32rdzeriuoiu
> EOF
Mark, 23 street, New Hampshire
I live on the 7 avenue
No match here...
azoiu32rdzeriuoiu
1 голос
/ 30 декабря 2011

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

(\d+)(?:st|nd|rd|th)

Я не знаю, ruby.В PHP я бы использовал что-то вроде:

preg_replace('/(\d+)(?:st|nd|rd|th) /', '$1', 'South 2nd Street');

для удаления суффикса

0 голосов
/ 30 декабря 2011

Чтобы удалить порядковый номер:

 /(\d+)(?:st|nd|rd|th)\b/$1/

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

http://www.regular -expressions.info / javascriptexample.html

...