2017-01-11 3 views
3

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

\d+([a-z -A-Z]+)? 

Это прекрасно работает для адресов, как Fake Street 123 и Fake Street 123a. Но теперь я пришел по адресу, вроде 2. Fake Street 123, и, конечно, выражение соответствует 2., а не 123. Как я могу изменить выражение, чтобы не соответствовать цифрам, за которыми следует . (то есть 23. Fake Street 123a не должен соответствовать 23., но 123a)?

+0

Это не совсем понятно, так как '([A-Z-A-Z] +)?' Это * опция * подшаблон, и она не ограничивает боковой контекст правой руки для цифр. * Что такое ** обязательный ** контекст для цифр? * Обратите внимание, что у вас есть диапазон между пробелом (32) и 'A' (65), чем на самом деле соответствует больше, чем буквам и пробелу. –

+0

Не можете ли вы просто сохранить свое регулярное выражение и использовать последнее совпадение, если найдено несколько совпадений? – grek40

+0

извините, но вам нужно 23. и 123a? –

ответ

2

Есть и другие хорошие ответы, объясняющие, как подойти к вашей проблеме поиска правильного номера. Что касается вопроса

Regex не совпадают номера следуют определенным характером

\d+($|[^\.\d]) 

совпадает с номером (по крайней мере, одна цифра), которая является либо конец строки или сопровождаемый не- который также не является .

+0

Это работает отлично, спасибо! – waka

0

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

Следующая Regex сделала спичку всего тест-случаи:

\d*.$ 

Он сканирует в течение ряда с последующим anyhting еще в конце строки ($)

+0

Вы можете сопоставить '.' с последней цифрой числа или с любым символом, который даже не удаленно связан с номером.Использование '' 'для завершения сопоставления строк является хорошим, но я был бы более подробным в предыдущей части. Например, с '\ d + [a-zA-Z]? $' – grek40

+0

Правильно. Если мы знаем больше о ожидаемых и недопустимых форматах, вы можете улучшить регулярное выражение. Это всего лишь минимальный подход для данных тестов (TDD :-)). – Marc

0

Если вы всегда хотите записать последние цифры строки, вы можете использовать конечный якорь ($).

(\d+.*)$ 

https://regex101.com/r/uWrPel/2

Это регулярное выражение будет проверять пространство, сопровождаемой любыми цифрами и дополнительными буквами в конце строки. (Обратите внимание, что у меня есть пробел перед группой захвата, чтобы отделить номера от текста)

0

Попробуйте это и сообщите мне, если у вас есть вопросы.

@"([0-9]{1,})" 
Смежные вопросы