2016-06-30 5 views
1

Я пытаюсь создать регулярное выражение для адресов.Regex - повторение периода, запятая и дефис

В настоящее время у меня есть [a-zA-Z0-9-\\.\-\,\\-\s\n], но он соответствует повторяющемуся периоду, повторяющему дефис и повторяющейся запятой. Есть ли способ ограничить количество запятых, дефис и период до 1?

Он должен соответствовать "5432 Lorem St. Tokyo, Japan 1234-54"

и он не должен соответствовать "5323 Dolor Ave... Kyoto,,,, Japan 555-33----33"

+1

Возможно, '^ [a-zA-Z0-9 \ s] + (?: [., -] [a-zA-Z0-9 \ s] +) * $' –

+0

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

+0

@cxw Я создаю один для javascript – Lemon

ответ

2

Чтобы запретить повторный символ из набора «запятая», «точка», или «дефис», вы можете использовать отрицательный предпросмотр закрепленную на старте:

/^(?!.*([.,-])\1)[a-zA-Z0-9\s.,-]+$/.test(str) 
    ^^^^^^^^^^^^^^^ 

В (?!.*([.,-])\1) касательно последующего проверяет, имеется ли представляет собой повторную запятую, точку или дефис (см. ([.,-])\1 - группа захвата, за которой следует обратная ссылка) и не удается найти совпадение, если найдено.

Кроме того, чтобы запретить частичные совпадения, необходимы анкеры - ^ для начала строки и $ для конца строки.

0
[^a-zA-Z0-9-\.-\,\-\s\n][a-zA-Z0-9-\.-\,\-\s\n][^a-zA-Z0-9-\.-\,\-\s\n] 

является многословно, но будет соответствовать ни одной из тех элементов, которые не (^) есть еще один по обе стороны от него. Это делает то, что вы хотите?

0

Как насчет чего-то подобного?

^([a-zA-Z0-9\s\n]|(([\.,-])(?!\3)))*$

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

Смежные вопросы