Регулярное выражение - в чем моя ошибка? - PullRequest
1 голос
/ 30 июля 2009

Я хотел бы сопоставить любую последовательность или цифры, или литерал: na. Я использую:

"^\d*|na$"

Числа сопоставляются, но не на.

В чем моя ошибка?

Подробнее: я использую это в валидаторе регулярного выражения для текстового поля в aspnet c #.

Пустая запись в порядке.

Ответы [ 4 ]

9 голосов
/ 30 июля 2009

Это потому, что выражение читается (при условии PCRE):

"^\d*" OR "na$"

Некоторые скобки позаботятся об этом в один миг. Выберите из (в зависимости от ваших потребностей):

"^(\d+|na)$"    // this will capture the number or na
"^(?:\d+|na)$"  // this one won't capture

Ура!

6 голосов
/ 30 июля 2009

Оператор | имеет более высокий приоритет, чем якоря ^ и $. Таким образом, выражение ^\d*|na$ означает совпадение ^\d* или na$. Так что попробуйте:

^(\d*|na)$

Или:

^\d*$|^na$
1 голос
/ 30 июля 2009

Возможно, ^(?:\d*|na)$ будет лучше. Какой язык / движок? Также, пожалуйста, покажите ввод и, если возможно, фрагмент кода.

Также возможно, что вы не соответствуете "na", потому что после него есть новая строка. Цифры не будут затронуты, потому что вы не указали для них якорь $.

Таким образом, в зависимости от языка и способа получения ввода, может быть новая строка между «na» и концом строки, и $ не будет соответствовать ей, если вы не включите многострочное совпадение (или зачистить строку новой строки).

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

Это может быть не лучший или самый элегантный способ исправить это, но попробуйте это:

"^\d*|[n][a]$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...