正则表达式不匹配序列中的两个相同字符

时间:2016-03-23 07:44:59

标签: javascript c# angularjs regex

我知道这对你们来说非常简单,但是我正在挠头找到正则表达式以匹配下面的字符串。尝试了不同的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]+$

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用基于预测的解决方案,例如

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

我使用了case-insenstive修饰符来避免一直写a-zA-Z。 我不确定是正确的连字符,但它是你使用的那个。

以下是演示:https://regex101.com/r/fD1gV0/1

答案 1 :(得分:1)

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

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

Demo

答案 2 :(得分:0)

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

在RegEx土地上,AFAICT,断言"不是"并不简单,但要求似乎很简单,可以反向处理:

(  |__|''|’’)

将匹配您标记为"不匹配",因此您只需要否定布尔匹配结果。

祝你好运。

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