Регулярное выражение, чтобы соответствовать все, кроме одной цифры - PullRequest
3 голосов
/ 20 марта 2012

Какому регулярному выражению соответствует - или не соответствует - все, кроме одной цифры?

Например,

  • stack должно соответствовать
  • stack overflow должно соответствовать
  • 12389237 должно соответствовать , но
  • 2 должно не соответствовать

Я на ^[^\d]+$, но, видимо, это не соответствует моему третьему условию.

РЕДАКТИРОВАТЬ:

Кстати, для PHP.

Ответы [ 6 ]

4 голосов
/ 20 марта 2012

Разбейте его на два случая.Либо соответствует одному символу, который не является цифрой, либо соответствует любой строке длиной 2 или более:

^(\D|.{2,})$
2 голосов
/ 20 марта 2012

Не соответствует ни одной цифре, инвертируя совпадение:

!/^\d\z/

Или просто регулярное выражение с отрицательным взглядом:

/^(?!\d\z)/
2 голосов
/ 20 марта 2012

Самое простое - просто отменить совпадение для одиночной цифры, используя обычную программную логику:

 ! /(?<!\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/

Встраивание операции into в шаблон никогда не бывает приятным.

/^ (?! \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
1 голос
/ 20 марта 2012

Это должно быть регулярное выражение? Для PHP вы делаете это

is_integer($string) && $string < 10
0 голосов
/ 20 марта 2012
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
0 голосов
/ 20 марта 2012

Следующее регулярное выражение будет соответствовать строке (включая пробелы) и любому числу, которое не является одной цифрой:

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

Код RegExr

...