регулярное выражение, соответствующее всем 8 символьным строкам, кроме «00000000» - PullRequest
1 голос
/ 22 апреля 2010

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

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

спасибо

Ответы [ 8 ]

12 голосов
/ 22 апреля 2010

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

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

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

8 голосов
/ 22 апреля 2010

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

2 голосов
/ 22 апреля 2010

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

1 голос
/ 22 апреля 2010

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

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

0 голосов
/ 22 апреля 2010

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

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

иди рисунок; -)

Привет

БВУ

0 голосов
/ 22 апреля 2010

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

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

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

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

Что за работа?

0 голосов
/ 22 апреля 2010

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

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

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

0 голосов
/ 22 апреля 2010

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

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

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

...