我想知道使用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 | cas​​e2)处理两者

^([^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/

10-12 00:31
查看更多