【问题标题】:Regular expression to not to match two same character in the sequence正则表达式不匹配序列中的两个相同字符
【发布时间】:2016-03-23 07:44:59
【问题描述】:

我知道这对你们来说非常简单,但我正在摸索寻找匹配以下字符串的正则表达式。尝试过不同的reg ex,但每次都失败。下面是需要匹配/不匹配的字符串。

S__ATHEESH – not match
S_A_T_HEESH – match 
S’_ATHEESH – match 
S’’ATHEESH – not match
S-A_THEESH - match

这是要求

a.       A name can have the special characters – space, apostrophe, underscore and hyphen. 
b.      There can be more than 1 special character in a name, but same special character cannot repeat more than once continuously. 
c.       There should be minimum 2 characters entered in the name field 

我有以下 reg ex,需要修改

^([a-zA-Z]+[ _'-])*[a-zA-Z]+$

感谢您的帮助。

【问题讨论】:

  • 根据您的要求,任何字符串都不应该匹配,因为所有字符串都有连续重复的字符'E'
  • @MohitC 关于连续特殊字符的问题
  • 您刚刚在标题中说“相同字符”以及要求 2。
  • 我刚刚更正了请求 2。

标签: javascript c# angularjs regex


【解决方案1】:

以下正则表达式将满足您的要求:

^(?=.{2})(?:[a-zA-Z]+|([ _’'-])(?!\1))+$
  • ^ 断言字符串开头的位置
  • (?=.{2}) 至少 2 个字符
  • 和 (:
    • [a-zA-Z]+ 至少一个字母字符
  • 或:
    • ([ _’'-]) 在捕获组 1 中捕获的空格、下划线、魔术撇号、撇号或破折号
    • (?!\1) 否定前瞻,刚刚捕获的内容也不是下一个角色
  • )+ 尽可能多次
  • $ 在字符串末尾断言位置

Demo

【讨论】:

    【解决方案2】:

    您可以使用基于前瞻的解决方案,例如

    /^(?!.*([-_ ’])\1)(?=(?:[^a-z]*[a-z]){2})[-_ ’a-z]+$/i
    
    • (?!.*([-_ ’])\1) 检查,没有双重特殊字符
    • (?=(?:[^a-z]*[a-z]){2}) 检查是否存在至少两个字母
    • ^[-_ ’a-z]+$ 匹配,如果只存在允许的字符

    我使用不区分大小写的修饰符来避免一直写a-zA-Z。 我不确定 是不是正确的连字符,但它是您使用的那个。

    这是一个演示:https://regex101.com/r/fD1gV0/1

    【讨论】:

      【解决方案3】:

      如果我错了,请纠正我,但您的要求只是一个接一个地不包含 2 个空格(或撇号、下划线或连字符)的字符串。

      在 RegEx 领域,AFAICT,断言“不”并不简单,但要求似乎很简单,可以反过来处理:

      (  |__|''|’’)
      

      将匹配您标记为“不匹配”的内容,因此您只需否定布尔匹配结果。

      祝你好运。

      编辑:只是为了确保我没有被误解。我并不是说你不能完全按照操作的要求去做,我只是说否定要求更简单,也更容易由其他人维护。

      【讨论】:

        猜你喜欢
        • 2014-05-21
        • 2018-01-09
        • 2010-10-13
        • 1970-01-01
        • 2021-05-10
        • 2015-09-30
        • 2021-12-29
        • 1970-01-01
        相关资源
        最近更新 更多