Проще всего просто свести на нет соответствия для одинокой цифры с помощью обычной программы логики:
! /(?<!\d)\d(?!\d)/
Encoding, что в одной модели в возможно, но раздражает:
/^(?!.*(?<!\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
EDIT
Если вы Неверный формат Ваш вопрос, и если вы просто означает, что струны фактически
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
Должен ли он также соответствовать пустой строке, потому что это тоже не цифра? – Kaivosukeltaja
Если это для PHP, почему у вас есть perl-тэг? – TLP
@Kaivosukeltaja Да, ничего, кроме одной цифры. Приветствия. –