正则表达式,无重复特殊字符(C#)

时间:2014-07-15 07:34:21

标签: c# regex asp.net-mvc-4

我是正则表达式的新手,需要一个正则表达式的地址,用户不能输入重复的特殊字符,如:.....,,,...///等,并且不能输入任何特殊字符字符串中的5次以上。

...,,,....// =>No Match
Street no. 40. hello. =>Match

提前致谢!
我试过这个:

([a-zA-Z]+|[\s\,\.\/\-]+|[\d]+)|(\(([\da-zA-Z]|[^)^(]+){1,}\))

它选择所有字母数字n一些特殊字符,没有空括号。

3 个答案:

答案 0 :(得分:1)

您可以使用Negative lookahead construction断言无效的匹配。它的格式是(?!...)

对于您的情况,您可以尝试这样的事情:

如果输入字符串有2个或更多连续的点,逗号或斜杠(或它们的任意组合),则它将与输入字符串不匹配

(?!.*[.,\/]{2}) ... rest of the regex 

如果输入字符串超过5个字符' A'这将与输入字符串不匹配。

(?!(.*A.*){5}) ... rest of the regex 

这将匹配除您的限制之外的所有内容。用你的正则表达式重写最后一部分(。*)。

^(?!.*[.,\/]{2})(?!(.*\..*){5})(?!(.*,.*){5})(?!(.*\/.*){5}).*$

注意:此正则表达式可能无法优化。如果你使用循环迭代字符串字符并计算它们的出现次数可能会更快。

答案 1 :(得分:1)

您可以使用此正则表达式:

^(?![^,./-]*([,./-])\1)(?![^,./-]*([,./-])(?:[^,./-]*\2){4})[ \da-z,./-]+$

在C#中:

foundMatch = Regex.IsMatch(yourString, @"^(?![^,./-]*([,./-])\1)(?![^,./-]*([,./-])(?:[^,./-]*\2){4})[ \da-z,./-]+$", RegexOptions.IgnoreCase);

<强>解释

  • ^锚点断言我们位于字符串的开头
  • 否定前瞻(?![^,./-]*([,./-])\1)声称无法匹配任意数量的特殊字符,后跟一个特殊字符(捕获到第1组),后跟相同的特殊字符(\1反向引用)
  • 否定前瞻(?![^,./-]*([,./-])(?:[^,./-]*\2){4})`声称无法匹配任意数量的特殊字符,后跟一个特殊字符(捕获到第2组),然后是任何非特殊字符和来自Group的相同字符2,四次(总共五次)
  • $锚点断言我们位于字符串的末尾

答案 2 :(得分:0)

用于检测无效字符串的正则表达式字符串是:

[^\w \-\r\n]{2}|(?:[\w \-]+[^\w \-\r\n]){5}

作为C# string literal(常规和逐字):

"[^\\w \\-\\r\\n]{2}|(?:[\\w \\-]+[^\\w \\-\\r\\n]){5}"

@"[^\w \-\r\n]{2}|(?:[\w \-]+[^\w \-\r\n]){5}"

查找字符串比验证字符串是否包含...

要容易得多

可以使用此表达式检查用户输入的字符串是否无效,因为序列中有2个特殊字符匹配,或者字符串中使用了5个特殊字符。

说明:

[^ ... ] ...一个负字符类定义,它匹配任何不是方括号中列出的字符之一的字符。

\w ...一个单词字符,可以是字母,数字或下划线。

下一个字符只是一个空格字符。

\- ...必须使用方括号内的反斜杠转义的连字符,否则连字符将被解释为“FROM x TO z”(除非是第一个或最后一个字符)方括号)。

\r ...回车

\n ...换行

因此[^\w \-\r\n]找到的字符不是字母,不是数字,不是下划线,不是空格,不是连字符,不是回车符,也不是换行符。

{2} ...前面的表达式必须匹配2个这样的字符。

因此,使用表达式[^\w \-\r\n]{2},可以检查字符串是否包含序列中的2个特殊字符,这使得字符串无效。

| ...或

(?: ... ) ...此处不需要标记组,用于将乘法器{5}内部表达式应用至少5次。

[ ... ] ...一个正面的字符类定义,它匹配任何字符,它是方括号中列出的字符之一。

[\w \-]+ ...找一个字符,空格或连字符1次或更多次。

[^\w \-\r\n] ...并且下一个字符不是单词字符,空格,连字符,回车符或换行符。

因此(?:[\w \-]+[^\w \-\r\n]){5}会在“标准”字符之间找到一个包含5个“特殊”字符的字符串。