2008-10-21 3 views
3

У меня есть этот простой регулярное выражение,Добавление элемента И условие для регулярных выражений

[\d]{1,5} 

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

Как бы я изменить его так, что он не соответствует 0, но соответствует 01 и 10 и т. д.?

Я знаю, что есть способ сделать OR, как так ...

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

(не имеет смысла)

Там способ сделать AND?

ответ

5

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

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

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

Майк

+0

Ваше выражение не будет соответствовать "10". – Kena 2008-10-21 17:02:59

+0

Вы правы, я обновился, чтобы быть более точным. Спасибо – 2008-10-21 17:04:55

+0

Ваше выражение также соответствует 00. Это явно не отрицается, но я не уверен, что это намерение. – Rontologist 2008-10-21 17:30:20

2

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

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

2

Как насчет OR между однозначными числами вы будете принимать и множественные значные номерами:

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

3

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

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

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

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

Используя внешний вид, вы можете добиться эффекта И.

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

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

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

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

^(?=\d{1,5}$)(?=.*?[1-9]).* 
0
^([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])$ 

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

1

Похоже, что вы ищете 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 
} 

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

2

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

#!/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 
Смежные вопросы