2010-04-22 2 views
1

Я пытаюсь найти регулярное выражение, которое соответствует любой строке с 8 символами, которая не равна «00000000».регулярное выражение, соответствующее всем 8 символьным строкам, кроме «00000000»

Может ли кто-нибудь мне помочь?

благодаря

+2

Будет ли ваш следующий вопрос соответствовать совпадению, кроме «0000000000000000» ... – kennytm

ответ

12

По крайней мере, PERL регулярное выражение, используя отрицательное опережения утверждение: ^(?!0{8}).{8}$, но лично я предпочел бы написать это как так:

length $_ == 8 and $_ ne '00000000'

Также обратите внимание, что если вы использовать regexp, в зависимости от языка, для которого вам может понадобиться флаг, чтобы совместить символы с символами новой строки, если вы этого хотите. В perl это флаг /s, для «однострочного режима».

+0

Christoffer - используйте @Marcelo и @klausbyskov, чтобы уведомить об изменениях ... таким образом они получат реальное уведомление в своей строке состояния и, надеюсь, возвращаются к вашему ответу снова :) См. http://meta.stackoverflow.com/questions/4798/lets-make-it-easier-to-reply-within-comments – tanascius

+0

Ах, спасибо @tanascius, @Marcelo и @klausbyskov. :) –

8

Если вы по какой-то причине не ввязались в него, это не проблема с регулярным выражением. Просто используйте len(s) == 8 && s != "00000000" или независимо от того, что ваш язык использует для сравнения строк и длин.

+1

и, конечно, проверка размера. – Nix

+0

Я использую валидацию Enterprise Library Validation, где мне нужно добавить регулярное выражение, вот что я хочу знать, как я могу определить регулярное выражение. – Wilson

+1

Несомненно, вы имели в виду '(s.length() == 8) && (s! =" 00000000 ")'? – ndim

0

Если у вас нет неуказанных требования, вы действительно не нужно регулярное выражение для этого:

if len(myString) == 8 and myString != "00000000": 
    ... 

(на языке по вашему выбору, конечно!)

+0

@Ritchie, что, если строка должна быть извлечена из большей строки ... – James

+0

@James: В вопросе говорится «любая строка с 8 символами». Но вопрос серьезно не определяет проблему, так кто знает? – RichieHindle

0

Если вам нужно извлечь все восемь символов строки не равны «000000000» из большей строки, вы можете использовать

"(?=.{8})(?!0{8})." 

идентифицировать первый символ каждой последовательности и извлечь восемь CHARACT начиная с его индекса.

+0

Это только извлечет один символ. Попробуйте '(?! 0 {8}). {8}'. –

+0

@ Кристофер: Это было мое намерение. Я подумал, что, возможно, OP хотел получить каждые восемь символов, соответствующих его требованиям, из большей строки. Как '12345678' и' 23456789' из '123456789'. Я не думаю, что это может быть достигнуто только с помощью Regex, но идентификация первого символа помогает. – Jens

-1

Не было ([1-9] ** | \ D *) {8} сделать это? Или я здесь что-то пропустил (это на самом деле просто обратный ndim, который кажется, что он должен работать).

Я предполагаю, что персонажи были выбраны для включения более чем цифр.

Хорошо, так что это было неправильно, поэтому, профессор Боло, я получил оценку? (Я люблю рег-выражения, поэтому мне действительно интересно).

>>> if re.match(r"(?:[^0]{8}?|[^0]{7}?|[^0]{6}?|[^0]{5}?|[^0]{4}?|[^0]{3}?|[^0]2}?|[^0]{1}?)", '00000000'): 
    print 'match' 
... 
>>> if re.match(r"(?:[^0]{8}?|[^0]{7}?|[^0]{6}?|[^0]{5}?|[^0]{4}?|[^0]{3}?|[^0]{2}?|[^0]{1}?)", '10000000'): 
...  print 'match' 
match 
>>> if re.match(r"(?:[^0]{8}?|[^0]{7}?|[^0]{6}?|[^0]{5}?|[^0]{4}?|[^0]{3}?|[^0]{2}?|[^0]{1}?)", '10011100'): 
...  print 'match' 
match 
>>> 

Эта работа?

+1

Как насчет 10000000? – rmarimon

+0

Правильно, не соответствует ли какая-либо строка, а не * 00000000? Какой 100000000 нет и подхвачен моим регулярным выражением. Или исправьте меня. – zenWeasel

+0

Прежде всего, ваше регулярное выражение не совпадает, например. 11101111. Во-вторых, из-за звездочки регулярное выражение соответствует строкам любой длины. – Bolo

1

Как уже упоминалось в других ответах, регулярные выражения не являются подходящим инструментом для этой задачи. Я подозреваю, что это домашнее задание, поэтому я только намечу на решение, вместо того, чтобы прямо указывать его.

Регулярное выражение «любые 8 символов, кроме 00000000» может быть разбито как сумма из восьми регулярных выражений в виде «8 символов с ненулевым символом на i-й позиции». Попробуйте записать такое выражение, а затем объедините их в один, используя альтернативу («|»).

+0

+1 для сбора запаха домашней работы. ;) – Pretzel

0

Конечно, можно было бы просто проверить

if stuff != '00000000' 
    ... 

, но и для записи, можно было бы легко использовать супертяжелом регулярное выражение (в Perl) для этого ;-)

... 
use re 'eval'; 

my @strings = qw'00000000 00A00000 10000000 000000001 010000'; 
my $L = 8; 

print map "$_ - ok\n", 
     grep /^(.{$L})$(??{$^Nne'0'x$L?'':'^$'})/, 
     @strings; 

... 

гравюр

00A00000 - ok 
10000000 - ok 

go figure ;-)

С уважением

БВУ

2

Если вам нужно регулярное выражение, ^(?!0{8})[A-Za-z0-9]{8}$ будет соответствовать строке ровно 8 символов. Изменение значений внутри [] позволит вам установить принятые символы.