1

我试图找出一个正则表达式,它匹配任何带有 8 个符号的字符串,它不等于“00000000”。

谁能帮我?

谢谢

4

8 回答 8

12

至少在 perl regexp 中使用否定的前瞻断言:^(?!0{8}).{8}$,但我个人宁愿这样写:

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

另请注意,如果您确实使用了正则表达式,则根据您的语言,您可能需要一个标志来使点匹配换行符,如果您愿意的话。在 perl 中,这就是/s“单行模式”的标志。

于 2010-04-22T11:50:57.430 回答
8

除非您由于某种原因被迫进入它,否则这不是正则表达式问题。只需使用len(s) == 8 && s != "00000000"或任何您的语言用来比较字符串和长度。

于 2010-04-22T11:53:18.827 回答
2

如果你需要一个正则表达式,^(?!0{8})[A-Za-z0-9]{8}$将匹配一个正好 8 个字符的字符串。更改 [] 内的值将允许您设置接受的字符。

于 2010-04-22T13:23:10.120 回答
1

如其他答案所述,正则表达式不是此任务的正确工具。我怀疑这是一个家庭作业,因此我只会暗示一个解决方案,而不是明确说明它。

正则表达式“除 00000000 之外的任何 8 个符号”可以分解为 8 个正则表达式的总和,形式为“第 i 个位置上具有非零符号的 8 个符号”。尝试写下这样的表达式,然后使用替代(“|”)将它们组合成一个。

于 2010-04-22T12:29:58.007 回答
0

除非您有未指定的要求,否则您实际上不需要正则表达式:

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

(当然是您选择的语言!)

于 2010-04-22T11:54:48.543 回答
0

如果您需要从较大的字符串中提取所有不等于“000000000”的八个字符串,您可以使用

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

识别每个序列的第一个字符并从其索引开始提取八个字符。

于 2010-04-22T12:04:36.350 回答
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

去搞清楚 ;-)

问候

rbo

于 2010-04-22T13:08:31.977 回答
-1

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

那个工作?

于 2010-04-22T12:06:15.053 回答