English 中文(简体)
正则表达式模式 - 允许使用字母数字、一些特殊字符,但不允许使用一定序列的字符。
原标题:
  • 时间:2009-01-09 21:00:08
  •  标签:

我有以下的正则表达式:

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

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

我希望如果字符串中按照以下顺序出现以下字符集,则不匹配:

&#

当我用"&"作为输入运行这个正则表达式时,它不符合我的模式,我会得到一个错误,非常好。当我用 .,&@:?!()$#/ABC123运行正则表达式时,它会匹配我的模式,没有错误。

然而,当我运行它时:

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

它也没有错误。我在检查&#序列方面做错了什么。

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

最佳回答

借鉴匹配引号字符串的技巧,将&从你的字符类中删除,添加一个&的另一种形式跟随#,并允许字符串可选地以&结尾:

^((?:[A-Za-z0-9- .,@:?!()$#/\]+|&[^#])*&?)$的翻译为中文:

问题回答

我会实际上把它分为两个部分:

  1. Check your allowed character set. To do this I would look for characters that are not allowed, and return false if there s a match. That means I have a nice simple expression:
    [^A-Za-z0-9 .&@:?!()$#^]
  2. Check your banned substring. And since it is just a substring, I probably wouldn t even use a regex for that part.

您没有提及您的语言,但如果使用C#:

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

^((?!&#)[A-Za-z0-9- .,&@:?!()$#/\])*$ 的中文翻译是:

note that the last is escaped (doubled) SO automatically turns \ into if not in backticks

假设使用 Perl 兼容的 RegExp

不匹配字符串 &# :

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

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

只是提供信息,虽然Ben Blank的正则表达式可行,但它比必要的要复杂。我会这样做:

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

因为我使用了负先行断言而不是否定字符类,所以正则表达式不需要任何额外的帮助就可以匹配字符串末尾的和号。

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

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

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

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

有几个错误:

  • It will test only one character in your set
  • The character in regular expressions is a token indicating that the next character is part of some sort of "class" of characters (ex. = is the line feed character). The character sequence ] is actually causing your bracketed list not to be terminated.

你可能最好使用

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

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

“+” 字符表示至少有一个字符被测试需要与正则表达式匹配;如果允许传递零长度字符串,请将“+”替换为“*”。





相关问题
热门标签