Добавление предложения AND в регулярное выражение - PullRequest
3 голосов
/ 21 октября 2008

У меня есть это простое регулярное выражение,

[\d]{1,5}

, которое соответствует любому целому числу от 0 до 99999.

Как бы я изменил его, чтобы он не совпадал с 0, но соответствовал 01 и 10 и т. Д.

Я знаю, что есть способ сделать ИЛИ, например ...

[\d]{1,5}|[^0]{1}

(не имеет особого смысла)

Есть ли способ сделать AND?

Ответы [ 8 ]

5 голосов
/ 21 октября 2008

вероятно лучше с чем-то вроде:

0 * [1-9] + [\ d] {0,4}

Если я прав, это переводится как «ноль или более нулей, за которыми следует хотя бы один из символов, включенных в« 1-9 », а затем до 4 конечных десятичных символов»

Mike

3 голосов
/ 21 октября 2008

Я думаю, что самый простой способ будет:

[1-9]\d{0,4}

бросьте это между ^ $, если это имеет смысл в вашем случае, и если да, добавьте 0 * в начало:

^0*[1-9]\d{0,4}$
2 голосов
/ 21 октября 2008

Я думаю, что негативный взгляд сработает. Попробуйте это:

#!/bin/perl -w

while (<>)
{
    chomp;
    print "OK: $_\n" if m/^(?!0+$)\d{1,6}$/;
}

Пример трассировки:

0
00
000
0000
00000
000000
0000001
000001
OK: 000001
101
OK: 101
01
OK: 01
00001
OK: 00001
1000
OK: 1000
101
OK: 101
2 голосов
/ 21 октября 2008

Как насчет ИЛИ между однозначными числами, которые вы принимаете, и многозначными числами:

^ [1-9] $ | ^ \ d {2,5} $

2 голосов
/ 21 октября 2008

Мой голос состоит в том, чтобы сделать регулярное выражение простым и сделать это как отдельное сравнение вне регулярного выражения. Если регулярное выражение проходит, преобразуйте его в int и убедитесь, что преобразованное значение> 0.

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

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

Похоже, вы ищете 2 различных условия. Почему бы не разбить его на 2 выражения? Это может быть проще и более читабельно.

var str = user_string;
if ('0' != str && str.matches(/^\d{1,5}$/) {
    // code for match
}

или следующее, если строка 0 также недействительна

var str = user_string;
if (!str.matches(/^0+$/) && str.matches(/^\d{1,5}$/) {
    // code for match
}

То, что вы можете сделать все это в одном регулярном выражении, не означает, что вы должны это делать.

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

С помощью прогнозирования вы можете добиться эффекта И.

^(?=regex1)(?=regex2)(?=regex3).*

Хотя в Internet Explorer есть ошибка, иногда она не воспринимает (?= ) как нулевую ширину.

http://blog.stevenlevithan.com/archives/regex-lookahead-bug

В вашем случае:

^(?=\d{1,5}$)(?=.*?[1-9]).*
0 голосов
/ 21 октября 2008
^([1-9][0-9]{0,4}|[0-9]{,1}[1-9][0-9]{,3}|[0-9]{,2}[1-9][0-9]{,2}|[0-9]{,3}[1-9][0-9]|[0-9]{,4}[1-9])$

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

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