【问题标题】:REgex for non repeating alphabets comma seperated用于非重复字母逗号分隔的正则表达式
【发布时间】:2021-12-16 02:10:27
【问题描述】:

我有一个要求,我需要一个正则表达式

  1. 不应重复字母
  2. 应该只包含字母和逗号
  3. 不应以逗号开头或结尾
  4. 可以包含 2 个以上的字母

示例:-

A,B     --- correct  
A,B,C,D,E,F --- correct  
D,D,A   --- wrong  
,B,C    --- wrong  
B,C,    --- wrong  
A,,B,C    --- wrong  

谁能帮忙?

【问题讨论】:

  • A,B,C也有效吗?
  • 是的,它是有效的
  • A,B,A 怎么样?仍然无效?
  • “可以包含超过 2 个字母”是什么意思?另外,是否允许不连续的重复字母,例如A,B,A,或者这也被禁止?
  • 您为什么没有回答以上问题?你是不是在 7 个多小时前就消失了?

标签: javascript regex typescript


【解决方案1】:

捕获的另一个想法并通过使用 lookahead 进行检查:

^(?:([A-Z])(?!.*?\1),?\b)+$

如果符合您的要求,您可以test here at regex101

如果您不想匹配单个字符,例如A,将+ 量词改为{2,}

【讨论】:

    【解决方案2】:

    问题的陈述在几个方面是不完整的。我做了以下假设:

    1. 考虑到D,D,A 是不正确的,我假设一个字母后面不能跟逗号后面跟同一个字母。
    2. 只要满足#1,字符串就可以多次包含同一个字母。
    3. 考虑到A,,B,C 不正确,我认为逗号不能跟在逗号后面。
    4. 由于示例仅包含大写字母,因此我假设不允许使用小写字母(尽管只需设置不区分大小写标志 (i) 即可允许任一大小写)。

    我们观察到,当且仅当字符串以大写字母开头并且后跟一系列逗号-大写字母对时,满足要求,前提是没有大写字母后跟逗号后跟同一个字母。因此,我们可以尝试匹配以下正则表达式。

    ^(?:([A-Z]),(?!\1))*[A-Z]$
    

    Demo

    表达式的元素如下。

    ^          # match beginning of string
    (?:        # begin a non-capture group
      ([A-Z])  # match a capital letter and save to capture group 1
      ,        # match a comma
      (?!\1)   # use negative lookahead to assert next character is not equal
               # to the content of capture group 1
    )*         # end non-capture group and execute it zero or more times
    [A-Z]      # match a capital letter
    $          # match end of string
    

    【讨论】:

      【解决方案3】:

      这是一个非常丑陋的正则表达式解决方案:

      var inputs = ['A,B', 'D,D,D', ',B,C', 'B,C,', 'A,,B'];
      for (var i=0; i < inputs.length; ++i) {
          if (/^(?!.*?([^,]+).*,\1(?:,|$))[^,]+(?:,[^,]+)*$/.test(inputs[i])) {
              console.log(inputs[i] + " => VALID");
          }
          else {
              console.log(inputs[i] + " => INVALID");
          }
      }

      正则表达式有两个部分。它使用负前瞻来断言输入中没有两个 CSV 条目重复。然后,它使用简单的模式来匹配任何正确的 CSV 分隔输入。这是一个解释:

      ^                               from the start of the input
          (?!.*?([^,]+).*,\1(?:,|$))  assert that no CSV element ever repeats
          [^,]+                       then match a CSV element
          (?:,[^,]+)*                 followed by comma and another element, 0 or more times
      $                               end of the input
      

      【讨论】:

      • 谢谢蒂姆,它确实有效,但它只适用于 2 个字母,我很抱歉我应该在我的问题中添加一点,它可以包含超过 2 个字母。你能帮我吗?
      • @Nitesh 自从我的第一篇文章以来,我编辑了几次。答案应该适用于任意数量的 CSV 元素。您可能需要重新加载页面。
      【解决方案4】:

      这个可以满足你的需要:

      ^(?!,)(?!.*,,)(?!.*(\b[A-Z]+\b).*\1)[A-Z,]+(?<!,)$
      
      • ^:字符串的开头
        • (?!,): 后面不能直接跟逗号
        • (?!.*,,): 后面不能跟两个逗号
        • (?!.*(\b[A-Z]+\b).*\1): 后面不能跟找到两次的值
      • [A-Z,]+: 只能包含字母和逗号
      • $: 字符串结尾
        • (?&lt;!,): 前面不能直接用逗号

      https://regex101.com/r/1kGVSB/1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        相关资源
        最近更新 更多