正则表达式模式 - 允许字母数字,一堆特殊字符,但不是特定的字符序列

时间:2009-01-09 21:00:08

标签: regex validation match

我有以下正则表达式:

(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

所以允许A-Z,a-Z,0-9和这些特殊字符'.,&@:?!()$#/\

如果在此字符串中的任何位置遇到以下字符集,我想不匹配:

&#

当我使用“&#”作为输入运行此正则表达式时,它与我的模式不匹配,我收到错误,很棒。当我使用'.,&@:?!()$#/\ABC123运行正则表达式时它与我的模式匹配,没有错误。

但是当我用它运行时:

'.,&#@:?!()$#/\ABC123

它也没有错误。检查&#sequence。

时,我做错了

有人能告诉我我做错了什么,我对这些事情并不好。

6 个答案:

答案 0 :(得分:5)

借用匹配引用字符串的技巧,从字符类中删除&,为& 而不是添加替代#,并允许字符串,可选地以&结尾:

  

^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$

答案 1 :(得分:1)

我实际上会分两部分来做:

  1. 检查您允许的字符集。要做到这一点,我会寻找不允许的字符,如果有匹配则返回false。这意味着我有一个很好的简单表达方式:
    [^A-Za-z0-9'\.&@:?!()$#^]
  2. 检查您的禁用子字符串。因为它只是一个子串,我可能甚至不会使用正则表达式。
  3. 您没有提及您的语言,但如果是在C#中:

    bool IsValid(string input)
    {
        return !(   input.Contains("&#")  
                   || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
                );
    }
    

答案 2 :(得分:0)

假设Perl兼容RegExp

要匹配字符串'&#':

  

(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$

虽然您不需要括号,因为您匹配整个字符串。

答案 3 :(得分:0)

^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$

请注意最后一个\被转义(加倍) 如果没有反引号,则会自动将\\变为\

答案 4 :(得分:0)

我建议在条件中使用两个正则表达式:

    if (string has sequence "&#")
      return false
    else
      return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")

我相信你的第二个“主要”正则表达式

^([A-Za-z0-9-'.,&@:?!()$#/\])$"

有几个错误:

  • 它只会测试你的设置中的一个字符
  • 正则表达式中的\字符是一个标记,表示下一个字符是某种“类”字符的一部分(例如\n =是换行符)。字符序列\]实际上导致您的括号列表不会被终止。

您可能最好使用

^[A-Za-z0-9-'.,&@:?!()$#/\\]+$

请注意,斜杠字符由双斜杠表示。

+字符表示至少有一个被测试的字符必须与正则表达式匹配;如果可以传递零长度字符串,请将+替换为*

答案 5 :(得分:0)

仅供参考,虽然Ben Blank的正则表达式有效,但它比它需要的更复杂。我会这样做:

^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$

因为我使用了负前瞻而不是否定字符类,所以正则表达式不需要任何额外的帮助来匹配字符串末尾的&符号。