我想知道使用Regex是否可行。我想排除所有字母(大写和小写)以及以下14个字符! “&‘* +,:; @ _
问题是等号。在我将要验证的字符串(必须为20或37个字符长)中,等号必须位于第17或第20位,因为它在这些位置用作分隔符。因此,它必须检查等号是否位于16或20位置以外的其他位置(但不能同时位于两个位置)。以下是一些示例:
通过:1234567890123456 = 12345678901234567890
通过:1234567890123456789 = 12345678901234567
不及格:123456 = 890123456 = 12345678901234567
不要通过:1234567890123456 = 12 = 45678901234567890
我很难接受必须在这两个位置上使用等号的部分,并且不确定Regex是否可行。添加if语句将需要进行大量的代码更改和回归测试,因为当前存储此正则表达式的此函数已由许多不同的插件使用。
最佳答案
我去
^([^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+|[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*)$
说明:
1)从允许的字符开始:
^[^a-zA-Z!"&'*+,:;<=>@_]$
[^ xxx]表示除xxx以外的所有字符,其中a-z为小写字母A-Z大写字母,而其他字符
2)重复16次,然后=,然后其他人允许使用字符(“ allowed char”后跟“ +”表示重复1至n次)
^[^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+$
此时,您将匹配第一种情况,即=在位置17处。
3)您的第二种情况是
^[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*$
最后一部分后接*,而不是+,以处理仅20个字符长且以=结尾的字符串
4)只需使用(case1 | case2)处理两者
^([^a-zA-Z!"&'*+,:;<=>@_]{16}=[^a-zA-Z!"&'*+,:;<=>@_]+|[^a-zA-Z!"&'*+,:;<=>@_]{19}=[^a-zA-Z!"&'*+,:;<=>@_]*)$
用记事本++和您的示例测试确定
编辑以精确匹配20或37个字符
^([^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})$
更具解释性的观点并附有解释:
`
^(
// 20 chars with = at 17
[^a-zA-Z!"&'*+,:;<=>@_]{16} // 16 allowed chars
= // followed by =
[^a-zA-Z!"&'*+,:;<=>@_]{3} // folowed by 3 allowed chars
|
[^a-zA-Z!"&'*+,:;<=>@_]{16} // 37 chars with = at 17
=
[^a-zA-Z!"&'*+,:;<=>@_]{20}
|
[^a-zA-Z!"&'*+,:;<=>@_]{19} // 20 chars with = at 20
=
|
[^a-zA-Z!"&'*+,:;<=>@_]{19} // 37 chars with = at 20
=
[^a-zA-Z!"&'*+,:;<=>@_]{17}
)$
`
关于c# - 正则表达式需要帮助,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36136016/