正则表达式匹配除一位数之外的所有内容

时间:2012-03-20 17:28:26

标签: php regex pcre

匹配的正则表达式是什么 - 或者不匹配 - 除了一个数字之外的所有内容?

例如,

  • stack应匹配
  • stack overflow应匹配
  • 12389237应与匹配,但
  • 2应该匹配

我在^[^\d]+$,但显然它与我的第三个条件不匹配。

修改

顺便说一句,这适用于PHP。

6 个答案:

答案 0 :(得分:4)

将其分解为两种情况。要么匹配不是数字的单个字符,要么匹配任何长度为2或更大的字符串:

^(\D|.{2,})$

答案 1 :(得分:2)

最简单的方法是使用普通程序逻辑来否定匹配单个数字:

 ! /(?<!\d)\d(?!\d)/

以单一模式编码可能,但令人讨厌:

/^(?!.*(?<!\d)\d(?!\d))/

或通过/x展开:

/ ^ (?! .* (?<! \d) \d (?! \d) )/x

或针对各种多线情况进行隔离:

 / \A (?! .* (?<! \d) \d (?! \d) )/sx

看看为什么我说拒绝定期积极比赛更容易?

这是测试程序:

use v5.12;
while (<DATA>) {
    my $got =  / ^ (?! .* (?<! \d) \d (?! \d) )/x;
    print $got ? "PASS" : "FAIL";
    print ": ", $_;

}
__END__
"stack" should match
"stack overflow" should match
"12389237" should match but
"2" should not match

产生:

PASS: "stack" should match
PASS: "stack overflow" should match
PASS: "12389237" should match but
FAIL: "2" should not match

修改

如果您错误地格式化了您的问题,并且您只是意味着字符串实际上是

stack
stack overflow
12389237
2

相反,那么简单的事情仍然是取消对单个数字的匹配:

! /^\d$/

或更仔细,

! /\A\d\z/

将ɴᴏᴛ操作构建到模式中永远不会很好。

/^ (?! \d $ )/x

这是另一个测试程序:

use v5.12;
while (<DATA>) {
    my $got =  /^ (?! \d $ )/x;
    print $got ? "PASS" : "FAIL";
    print ": $_";

}
__END__
stack
stack overflow
12389237
2

报道:

PASS: stack
PASS: stack overflow
PASS: 12389237
FAIL: 2

答案 2 :(得分:2)

不匹配单个数字,反转匹配:

!/^\d\z/

或者只是带有负面前瞻的正则表达式:

/^(?!\d\z)/

答案 3 :(得分:1)

它必须是正则表达式吗?对于PHP你喜欢这个

is_integer($string) && $string < 10

答案 4 :(得分:0)

以下正则表达式将匹配字符串(包括空格)和任何不是单个数字的数字:

/^[a-zA-z\s]+|[0-9]{2,}$/gm

RegExr Code

答案 5 :(得分:0)

while(my $line = <DATA>){
    chomp $line;
    if ($line !~ /^\d{1}$/) {
        print "$line    match\n";
    }
    else {
        print "$line    NOT match\n";
    }
}

__DATA__
stack
stack overflow
12389237
2

结果:

perl regex.pl
stack   match
stack overflow  match
12389237        match
2       NOT match