我有以下regex:

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

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

我想不匹配如下设置的字符遇到的任何地方在串这个顺序:

&#

当我运行这个regex只有"&#"作为输入的,它不符合我的模式,我得到一个错误,巨大的。当我运行regex与 '.,&@:?!()$#/\ABC123 它不符合我的模式,没有错误。

但是当我运行为:

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

它不会错误。我做错了什么的检查&#序列。

可以有人告诉我我做错了,我不是伟大的与这些事情。

有帮助吗?

解决方案

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

  

<代码> ^(?(:[?!A-ZA-Z0-9 - ”,@:()$#/ \\] + |&安培; [^#])*&安培)$

其他提示

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

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

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

<代码> ^((&安培;#)[A-ZA-Z0-9 - ”,&安培; @:?!()$#/ \\]?!)* $

请注意,最后一个\被转义(加倍) SO会自动将 \\ 转换为\,如果不是在反引号中

假设Perl兼容RegExp

要匹配字符串'&amp;#':

  

<代码>(?![^&安培;] *&安培;#)^([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-'.,&@:?!()$#/\")

我相信你的第二个"主要"regex的

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

有几个错误:

  • 它将测试只有一个角色在设置你的
  • \ 性格中经常表达是一个令指示下一字一部分的某种"类别"的字符的(ex。 \n =是线料字符)。字符序列 \] 实际上造成方括号内列不要被终止。

你可能会更好利用

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

注意,削减字表示的是由双斜线。

+ 字表明,至少有一个角色正在测试具有相匹配的regex;如果它是好通过一个零的长串,替换 +*.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top