我对正则表达式很陌生,我正在尝试创建一个用于验证发票格式的正则表达式。
模式应该是: JjYy(所有4个字符都是合法的),使用0次,2次或4次 例如没有Y是有效的,YY是有效的,YYYY是有效的,但是YYY应该失败。 随后是一系列0重复3到10次。 整体不应超过10个字符。
例子: JyjY000000有效(尽管很奇怪) YY000有效 000000有效 jjj000无效 jjjj0无效
我从here学到了一些基础知识,但是我的正则表达式失败了。有人可以协助改善吗?
到目前为止我的正则表达式是:[JjYy]{0}|[JjYy]{2}|[JjYy]{4}[0]{3,10}
。
以下失败:[JjYy]{0|2|4}[0]{3,10}
答案 0 :(得分:3)
由于您需要的总长度不超过10个字符,我认为您必须分别处理这三种前缀:
0{3,10}|[JjYy]{2}0{3,8}|[JjYy]{4}0{3,6}
答案 1 :(得分:2)
怎么样:
^([JjYy]{2}){0,2}0{3,10}$
要检查长度是否为十个字符或更少,请使用字符串长度函数而不是正则表达式 - 不要用螺丝刀敲钉子,等等。
测试:
#!perl
use warnings;
use strict;
my $re = qr/^([JjYy]{2}){0,2}0{3,10}$/;
my %tests = qw/JyjY000000 valid
YY000 valid
000000 valid
jjj000 invalid
jjjj0 invalid/;
for my $k (keys %tests) {
print "$k is ";
if ($k =~ /$re/) {
print "valid";
} else {
print "invalid";
}
print " and it should be $tests{$k}.\n";
}
可生产
jjjj0 is invalid and it should be invalid. YY000 is valid and it should be valid. JyjY000000 is valid and it should be valid. jjj000 is invalid and it should be invalid. 000000 is valid and it should be valid.
答案 2 :(得分:2)
([jJyY]{2}){0,2}0{3,10}
如果总长度限制包含jJyY
部分,您可以使用负面预测进行检查,以确保字符串中的字符数不超过10个,以(?![jJyY0]{11,})
<开头/ p>
\b(?![jJyY0]{11,})([jJyY]{2}){0,2}0{3,10}\b
答案 3 :(得分:1)
这可能取决于您使用什么来实现正则表达式。例如,我前几天发现Notepad ++仅支持一些基本操作符。管道之类的东西不是核心正则表达式标准的一部分。
我建议这样的事情:
([JjYy]{2}([JjYy]{2})?)?[0]{3,10}
如果您使用的是编程语言,则需要使用字符串长度函数来验证长度。
编辑:实际上,您应该能够通过分离不同的情况来验证长度:
([0]{3,10})|([JjYy]{2}[0]{3,8})|([JjYy]{4}[0]{3,6})
答案 4 :(得分:1)
您希望将字符串限制为10个字符。因此,为了做到这一点,你必须考虑哪些有效组合将构成10个字符。
因此有效组合将是:
因此,包含所有这些的表达式将是:
/0{3,10}|[JY]{2}0{3,8}|[JY]{4}0{3,6}/i
不区分大小写的匹配就足够了,尽管通过明确说出/[JjYy]/
而不是/[JY]/i
,您可以从某些正则表达式引擎获得额外的性能。