将AND子句添加到正则表达式

时间:2008-10-21 16:56:14

标签: regex

我有这个简单的正则表达式,

[\d]{1,5}

匹配0到99999之间的任何整数。

如何修改它以使其不匹配0,但匹配01和10等?

我知道有办法做一个OR就像这样......

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

(没有多大意义)

有办法做一个AND吗?

8 个答案:

答案 0 :(得分:5)

最好用以下的东西:

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

如果我是对的,则转换为“零或多个零后跟至少一个'1-9'中包含的字符,然后最多4个尾随十进制字符”

麦克

答案 1 :(得分:3)

我认为最简单的方法是:

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

如果在你的情况下有意义的话,把它扔到^ $之间,如果是的话,在开头添加0 *:

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

答案 2 :(得分:2)

我的投票是保持正则表达式简单,并将其作为正则表达式之外的单独比较。如果正则表达式通过,则将其转换为int并确保转换后的值为> 0

但我知道,有时控件中的配置文件或验证属性中的一个正则表达式就是你得到的。

答案 3 :(得分:2)

您接受的单位数字与多位数字之间的OR如何:

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

答案 4 :(得分: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

答案 5 :(得分:1)

通过使用前瞻,您可以实现AND的效果。

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

虽然Internet Explorer中存在错误,但有时不会将(?= )视为零宽度。

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

在你的情况下:

^(?=\d{1,5}$)(?=.*?[1-9]).*

答案 6 :(得分:1)

看起来你正在寻找两种不同的条件。为什么不把它分解为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
}

仅仅因为你可以在一个正则表达式中完成这一切并不意味着你应该这样做。

答案 7 :(得分: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])$

不漂亮,但应该有效。这更像是一种蛮力的方法。还有一种更好的方法可以通过分组来实现,但我现在在实际实现上留下了空白。