2

我有以下正则表达式:

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

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

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

&#

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

但是,当我运行它时:

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

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

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

4

6 回答 6

6

借用一种技术来匹配带引号的字符串,&从你的字符类中删除,添加一个替代& not跟随#,并允许字符串可选地以 结尾&

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

于 2009-01-09T21:20:57.413 回答
1

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

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

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

bool IsValid(string input)
{
    return !(   input.Contains("&#")  
               || Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input) 
            );
}
于 2009-01-09T21:09:57.747 回答
0

假设 Perl 兼容 RegExp

不匹配字符串 '&#':

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

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

于 2009-01-09T21:16:35.347 回答
0

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

请注意,最后一个 \ 被转义(加倍)\\所以如果不在反引号中,则会自动变成 \

于 2009-01-09T21:20:27.803 回答
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-'.,&@:?!()$#/\\]+$

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

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

于 2009-01-09T21:30:29.547 回答
0

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

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

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

于 2009-01-10T04:44:27.690 回答