我是正则表达式的新手,需要一个正则表达式的地址,用户不能输入重复的特殊字符,如:.....
或,,,...///
等,并且不能输入任何特殊字符字符串中的5次以上。
...,,,....// =>No Match
Street no. 40. hello. =>Match
提前致谢!
我试过这个:
([a-zA-Z]+|[\s\,\.\/\-]+|[\d]+)|(\(([\da-zA-Z]|[^)^(]+){1,}\))
它选择所有字母数字n一些特殊字符,没有空括号。
答案 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个“特殊”字符的字符串。