我想知道使用正则表达式是否可行。我想排除所有字母(大写和小写)以及以下14个字符! “& '* +,:; < => @ _
问题是等号。在我要验证的字符串(必须是20或37个字符长)中,该等号必须位于第17或第20位,因为它在这些位置用作分隔符。因此,必须检查该等号是否在第16或第20位以外的任何位置(但不是两者)。以下是一些例子:
传球:1234567890123456 = 12345678901234567890
传球:1234567890123456789 = 12345678901234567
不通过:123456 = 890123456 = 12345678901234567
不通过:1234567890123456 = 12 = 45678901234567890
我很困难,我必须在这两个位置允许等号,并且不确定是否可以使用正则表达式。添加if语句需要大量的代码更改和回归测试,因为当前存储此正则表达式的函数被许多不同的插件使用。
答案 0 :(得分:2)
我会去
frame
说明:
1)从您允许的字符开始:
^([^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+|[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*)$
[^ xxx]表示除xxx以外的所有内容,其中a-z为小写字母A-Z大写字母,而您的其他字符
2)重复16次,然后=,然后其他人允许使用字符(&#34;允许字符#34;然后按&#39; +&#39;告诉它重复1到n次)
^[^a-zA-Z!"&'*+,:;<=>@_]$
此时,您将匹配您的第一个案例,当=在第17位时。
3)你的第二个案例将是
^[^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+$
最后一部分后跟*而不是+来处理只有20个字符长的字符串,结尾为=
4)只需使用(case1 | case2)来处理两者
^[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*$
使用notepad ++和您的示例
进行了测试编辑以匹配20或37个字符
^([^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+|[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*)$
更具有解释性的可读视图:
^([^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]{3}|[^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]{20}|[^a-zA-Z!"&'*+,:;<=>@_]{19}=|[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]{17})$
`
答案 1 :(得分:1)
我省略了与其他符号匹配的其他符号,只是放置了[^=]
,除了=
var r = new Regex(@"^(([0-9\:\<\>]{16,16}=(([0-9\:\<\>]{20})|([0-9\:\<\>]{3})))|(^[^=]{19,19}=(([0-9\:\<\>]{17}))?))$");
/*
@"^(
([0-9\:\<\>]{16,16}
=
(([0-9\:\<\>]{20})|([0-9\:\<\>]{3})))
|
(^[^=]{19,19}
=
(([0-9\:\<\>]{17}))?)
)$"
*/
使用{length,length}
您还可以指定整个字符串长度。最后的$
和开头的^
也很重要。