正则表达式帮助需要

时间:2016-03-21 16:03:39

标签: c# regex

我想知道使用正则表达式是否可行。我想排除所有字母(大写和小写)以及以下14个字符! “& '* +,:; < => @ _

问题是等号。在我要验证的字符串(必须是20或37个字符长)中,该等号必须位于第17或第20位,因为它在这些位置用作分隔符。因此,必须检查该等号是否在第16或第20位以外的任何位置(但不是两者)。以下是一些例子:

传球:1234567890123456 = 12345678901234567890

传球:1234567890123456789 = 12345678901234567

不通过:123456 = 890123456 = 12345678901234567

不通过:1234567890123456 = 12 = 45678901234567890

我很困难,我必须在这两个位置允许等号,并且不确定是否可以使用正则表达式。添加if语句需要大量的代码更改和回归测试,因为当前存储此正则表达式的函数被许多不同的插件使用。

2 个答案:

答案 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 | cas​​e2)来处理两者

^[^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}您还可以指定整个字符串长度。最后的$和开头的^也很重要。