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

Regex Pattern - Allow alpha numeric, a bunch of special chars, but not a certain sequence of chars

提问人:John Batdorf 提问时间:1/10/2009 最后编辑:nhahtdhJohn Batdorf 更新时间:1/12/2014 访问量:47884

问:

我有以下正则表达式:

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

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

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

&#

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

但是,当我使用以下命令运行它时:

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

它也不会出错。我在检查&#序列时做错了。

有人能告诉我我做错了什么吗,我不擅长这些事情。

正则表达式 验证 匹配

评论


答:

1赞 Joel Coehoorn 1/10/2009 #1

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

  1. 检查允许的字符集。为此,我会查找不允许的字符,如果匹配,则返回 false。这意味着我有一个很好的简单表达:
    [^A-Za-z0-9'\.&@:?!()$#^]
  2. 检查您被禁止的子字符串。由于它只是一个子字符串,我甚至可能不会为该部分使用正则表达式。

你没有提到你的语言,但如果在 C# 中:

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

评论

0赞 John Batdorf 1/10/2009
是的,我同意,这就是我通常的做法,但见下文。
0赞 Rob 1/10/2009 #2

假设 Perl 兼容 RegExp

要与字符串“&#”不匹配,请执行以下操作:

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

尽管您不需要括号,因为您正在匹配整个字符串。

0赞 foson 1/10/2009 #3

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

请注意,最后一个 \ 被转义(加倍) SO 会自动变成 \ 如果不是反引号\\

6赞 Ben Blank 1/10/2009 #4

借用一种匹配带引号的字符串的技术,从字符类中删除,添加一个替代项,即后跟 ,并允许字符串可以选择以 :&&#&

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

评论

3赞 Gumbo 1/10/2009
这也允许像“&∆”这样的序列,而∆是其中之一,例如“_”、“<”、“>”等。所以以下会更好:^(?:[A-Za-z0-9-'.,@:?!()$#/\]+|&[A-Za-z0-9-'.,@:?!()$/\])*$[^#]
0赞 Perry Pederson 1/10/2009 #5

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

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

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

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

有几个错误:

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

你最好使用

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

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

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

评论

0赞 Alan Moore 1/10/2009
你指出的错误并不完全是OP的错。论坛软件吃了几个星号和一个反斜杠。当你试图谈论正则表达式而不对它们进行编码时,就会发生这种情况。
0赞 Alan Moore 1/10/2009
顺便说一句,如果 John 真的不小心逃脱了右方括号,正则表达式甚至不会编译。
0赞 Alan Moore 1/10/2009 #6

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

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

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