Нужен простой RegEx, чтобы найти номер в одном слове - PullRequest
3 голосов
/ 31 октября 2008

У меня есть следующий URL-маршрут, и я хочу убедиться, что сегмент маршрута будет принимать только цифры. как таковой, я могу предоставить некоторое регулярное выражение, которое проверяет слово.

/ страница / {CurrentPage}

так что ... может кто-нибудь дать мне регулярное выражение, которое соответствует, когда слово является числом (любым целым числом) больше 0 (т.е.

Ответы [ 6 ]

25 голосов
/ 31 октября 2008
/^[1-9][0-9]*$/

Проблемы с другими ответами:

/([1-9][0-9]*)/ // Will match -1 and foo1bar
#[1-9]+# // Will not match 10, same problems as the first
[1-9] // Will only match one digit, same problems as first
5 голосов
/ 31 октября 2008

Если вы хотите, чтобы оно было больше 0, используйте это регулярное выражение:

/([1-9][0-9]*)/

Это будет работать до тех пор, пока у числа нет начальных нулей (например, '03').

Тем не менее, я рекомендую просто использовать [0-9]+ регулярное выражение и проверить число в фактическом коде вашего сайта.

1 голос
/ 31 октября 2008

Это поможет решить вашу конкретную проблему. Это выражение

/\/page\/(0*[1-9][0-9]*)/ or "Perl-compatible" /\/page\/(0*[1-9]\d*)/

должен захватывать любое ненулевое число, даже заполненное 0. И поскольку он даже не ищет знака, - после косой черты не будет соответствовать шаблону.

Проблема с выражением лица без век заключается в том, что, скорее всего, у вас еще нет выделенного числа, чтобы сработали ^ и $. Вам придется проделать некоторую работу , чтобы изолировать это. Но общее решение не состояло бы в том, чтобы предположить, что число - это все, что содержит строка, как показано ниже.

/(^|[^0-9-])(0*[1-9][0-9]*)([^0-9]|$)/

А две конечные группы вы можете заменить на границы слова отметки (\b), если они есть в языке RE. В противном случае вы бы поместили их в группы без захвата, если бы язык имел их, или даже искали обходные пути, если бы они были таковыми - но, скорее всего, у них были бы границы слов перед поисковыми обходами.

Полная Совместимая с Perl версия:

/(?<![\d-])(0*[1-9]\d*)\b/

Я выбрал отрицательный вид сзади вместо границы слова, потому что '-' не является словом-символом, и поэтому -1 будет иметь «границу слова» между «-» и «1». И отрицательный взгляд сзади будет соответствовать началу строки - просто не может быть цифры или «-» впереди.

Можно сказать, что предположение о нулевой ширине ^ является лишь одним из случаев, когда выполняется предположение о нулевой ширине (?<![\d-]).

0 голосов
/ 31 октября 2008

Это будет соответствовать любой строке, так что, если она содержит /page/, за ней должно следовать число, не состоящее только из * нулей.

^(?!.*?/page/([0-9]*[^0-9/]|0*/))

(?! ) - негативный прогноз. Он будет соответствовать пустой строке, только если содержащийся в нем шаблон не соответствует текущей позиции.

0 голосов
/ 31 октября 2008

Хотя регулярное выражение Джереми не является совершенным (его следует проверять в контексте, с ведущими символами и т. Д.), Его совет хорош: используйте общее простое регулярное выражение (например, если вы должны использовать его в mod_rewrite Apache), но любым способом, обработайте окончательный редирект в коде сервера (если можете) и выполните реальную проверку правильности там параметра.

В противном случае я бы улучшил выражение Джереми с помощью границ: /\b([1-9][0-9]*)$/
Конечно, регулярное выражение не может обеспечить проверку против любого max int, в лучшем случае вы можете контролировать количество цифр: /\b([1-9][0-9]{0,2})$/ например.

0 голосов
/ 31 октября 2008
string testString = @"/page/100";
string pageNumber = Regex.Match(testString, "/page/([1-9][0-9]*)").Groups[1].Value;

Если не соответствует, pageNumber будет ""

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