2012-03-20 1 views
3

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

Например,

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

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

EDIT:

Это для PHP, кстати.

+2

Должен ли он также соответствовать пустой строке, потому что это тоже не цифра? – Kaivosukeltaja

+0

Если это для PHP, почему у вас есть perl-тэг? – TLP

+0

@Kaivosukeltaja Да, ничего, кроме одной цифры. Приветствия. –

ответ

4

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

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

Боюсь, вы неправильно поняли этот вопрос. – tchrist

+0

@tchrist: Почему? Кажется, он соответствует запрошенным критериям. – VeeArr

+0

Ваш шаблон соответствует его четвертой строчке, и это не предполагается. – tchrist

0

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

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

RegExr Code

+1

Это не будет работать на то, что он сказал. Кроме того, нет никаких оснований полагать одиночные '\ D' в окружающих квадратных скобках. – tchrist

+0

@tchrist Вы правы, я изменил свой ответ. – PenguinCoder

+0

Я не уверен, что ваши '/ g' или'/m' имеют смысл. Что ты думаешь? – tchrist

2

Проще всего просто свести на нет соответствия для одинокой цифры с помощью обычной программы логики:

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

Различия '\ z' vs' $ 'более значимы, чем' \ A' vs '^'; AFAIK последнее только имеет значение, если вы интерполируете фрагмент регулярного выражения строки в контекст/m. – ysth

+1

@ysth Увы, больше нет. Нужно гарантировать правильное поведение даже перед лицом переопределенной лексически ограниченной «use re»/msx «прагма». – tchrist

+0

Спасибо. Это похоже на достаточно веревку :) – ysth

2

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

!/^\d\z/ 

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

/^(?!\d\z)/ 
+0

Вместо этого вы можете использовать '\ Z' или' $'. В противном случае +1, поскольку это то, что я собирался опубликовать. – TLP

+0

Ну, если вы хотите разрешить разрыв строки до конца строки (например, «2 \ n»), вы можете использовать '$' или '\ Z' вместо' \ z'. – Qtax

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 
+0

'{1}' избыточен во всех отношениях, кроме как явный. – TLP

1

ли это должно быть регулярным выражением? Для php вам действительно нравится

is_integer($string) && $string < 10 
+1

'Undefined subroutine & main :: is_integer называется at..' – TLP

+0

Извините, только для php not perl – safarov

+0

Это неплохая идея, просто не решение perl. – TLP

 Смежные вопросы

  • Нет связанных вопросов^_^