Skip to main content
 首页 » 编程设计

c#之需要正则表达式帮助

2024年05月06日38softidea

我想知道这是否可以使用正则表达式。我想排除所有字母(大写和小写)和以下 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} 
)$ 

`