匹配的正则表达式是什么 - 或者不匹配 - 除了一个数字之外的所有内容?
例如,
stack
应匹配stack overflow
应匹配12389237
应与匹配,但 2
应该不匹配我在^[^\d]+$
,但显然它与我的第三个条件不匹配。
修改
顺便说一句,这适用于PHP。
答案 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)
答案 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