我想知道这是否可以使用正则表达式。我想排除所有字母(大写和小写)和以下 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!"&'*+,:;<=>@_]*)$
使用 notepad++ 和您的示例测试正常
编辑以精确匹配 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})$
带有解释的更具可读性的 View :
`
^(
// 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/