【问题标题】:Regex three letters separated by comma and no repeating letters正则表达式三个字母以逗号分隔且没有重复字母
【发布时间】:2016-11-23 19:38:29
【问题描述】:

我陷入了一个正则表达式,我需要在其中创建正则表达式

  1. 最多可以有三个给定字母
  2. 三个字母之间用逗号隔开
  3. 如果单个字母没有逗号
  4. 而且逗号不能算
  5. 字母不应重复

示例: 三个字母将是S,E,C

正则表达式应该匹配:

S
S,E
S,C
S,E,C
E,C
C

应该匹配:

S,S
S,E,E,C
S,E,C,C
S,E,C,S
S,E,C,E,S

我试过这个正则表达式:

^[SEC]{1,3}$

但我不知道如何排除重复字母以及如何包含逗号而不计算逗号

谢谢

【问题讨论】:

标签: java regex


【解决方案1】:

character class [SCE] 将匹配 SCE

然后,要匹配零个、一个或两个逗号序列和 3 个允许的字符之一,您需要一个 grouping construct(,[SCE]){0,2},或者,使用非捕获分组结构,(?:,[SCE]){0,2}

为确保没有重复的字符,请在开头使用锚定的 negative lookahead,一旦找到相同的字符,匹配将失败 - ^(?!.*([SCE]).*\1) - 其中([SEC]) 是第 1 组,\1backreference 指的是在该组中捕获的值(SEC

使用

^(?!.*([SCE]).*\1)[SCE](?:,[SCE]){0,2}$ 

regex demo

【讨论】:

    【解决方案2】:

    你可以使用这个正则表达式:

    ^[SEC](?:,[SEC]){0,2}$
    

    RegEx Demo

    此正则表达式允许 S,E,C 之一在开头,后跟逗号分隔的同一组字母 0 到 2 次。

    如果您只希望所有唯一字母使用:

    ^([SEC])(?:,(?!\1|\2)([SEC])){0,2}$
    

    【讨论】:

    • 感谢您的回答,但如果我提供输入 S,S 它接受在我的情况下这是错误的,我不想重复使用的字符。
    • 如果您想要所有唯一的字母,请使用:^([SEC])(?:,(?!\1|\2)([SEC])){0,2}$
    猜你喜欢
    • 1970-01-01
    • 2021-12-16
    • 2012-08-23
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多