我编写了一个正则表达式来验证必须遵守以下规则的字符串:
- 必须至少为一个字符
- 不得包含空白字符
- 第一个字符不能是标点符号
- 最后一个字母不能是标点符号
- 不能以标点符号结尾,后跟数字
- 所有其他字符可以是除
/[:@#]
.
这是正则表达式:
my $name_re = qr/
[^[:punct:][:blank:]] # not punct or blank
(?: # followed by...
[^[:blank:]:@#]* # any number non-blank, non-@, non-#, non-@
[^[:punct:][:blank:]] # one not blank or punct
)? # ... optionally
/x;
看到有什么遗漏吗?不执行规则#5。我一直在通过编写如下代码来执行它:
die "$proj is not a valid name" unless $proj =~ /\A$name_re\z/
&& $proj !~ /[[:punct:]][[:digit:]]+\z/;
有很多地方我必须这样做,所以我宁愿这一切都在一个正则表达式中完成。问题是:如何?什么正则表达式会拒绝诸如“foo,23”之类的值?