【问题标题】:regex to match only one upper case letter正则表达式仅匹配一个大写字母
【发布时间】:2018-08-31 08:24:00
【问题描述】:

如果超过不匹配,我需要匹配(必须至少只有一个大写字母)。

    Kitty   || Valid has one upper case letter  
    wiDivb  || Valid has one upper case letter
    ikBVu   || Invalid more than one upper case letter
    welcmw  || Invalid No upper case letter
    A       || Valid has one upper case letter  
    AA      || Invalid more than one upper case letter

我试过了:

(?=.*[a-z])(?=.*[A-Z]{1})

但它匹配,即使它有多个大写字母,我只想要一个,所以我添加了{1},但它没有

【问题讨论】:

  • 您是否还需要至少 1 个小写字母?还是A 有效?
  • @Barmar 是的A 也有效,但AA 无效,我只想检查大写字母(必须是一个且不超过一个),这就是我为什么一直在想(?=.*[A-Z]{1})
  • 连字符、变音符号之类的呢? ^[^A-Z\s]*[A-Z][^A-Z\s]*$ 将允许带有单个大写英文字母的单词,但允许任何其他字符。如果特定语言,我是瑞典语,请添加大写的瑞典变音符号,即^[^A-ZÅÄÖÉÜ\s]*[A-ZÅÄÖÉÜ][^A-ZÅÄÖÉÜ\s]*$

标签: regex


【解决方案1】:

如果你不需要任何小写字母,你可以使用:

^[a-z]*[A-Z][a-z]*$

这匹配任意数量的小写字母,后跟一个大写字母,后跟任意数量的小写字母。

如果您至少需要一个小写字母,则可以使用交替处理两种情况,其中小写字母在左侧是可选的,右侧是必需的,或者是右侧是可选的,左侧是必需的:

^(?:[a-z]*[A-Z][a-z]+|[a-z]+[A-Z][a-z]*)$

【讨论】:

    【解决方案2】:

    你可以使用

    ^(?=.*[a-z])[a-z]*[A-Z][a-z]*$
    

    请参阅regex demo

    详情

    • ^ - 字符串开头
    • (?=.*[a-z]) - 在字符串开头的除换行符之外的任何 0+ 个字符之后至少有一个小写 ASCII 字母
    • [a-z]* - 0+ 小写 ASCII 字母
    • [A-Z] - 一个大写的 ASCII 字母
    • [a-z]* - 0+ 小写 ASCII 字母
    • $ - 字符串结束。

    【讨论】:

    • ^(?=[a-z]*[A-Z][a-z]*).*$ 不会更简单吗?
    • @UnbearableLightness 不,事实上还必须至少有 1 个小写字母。请参阅原始模式中的(?=.*[a-z])
    • 对,我读了 OP 说 only one upper case letter at least 但后来意识到第三个字符串不应该匹配。
    • 它工作得很好,但如果我只想检查大写字母(必须只有一个大写字母,不能超过一个),即使A 是无效的但AA 不是,这就是为什么我一直在考虑(?=.*[A-Z]{1})
    • @ShGurl {1} 在每个正则表达式中都是多余的,默认行为是只匹配一个原子一次。 ab 将匹配 1 a,然后匹配 1 b。它不限制任何东西,只是“重复”匹配量化的子模式。
    【解决方案3】:

    您的正则表达式使用 2 个肯定的前瞻,它们断言至少有一个小写字符 (?=.*[a-z]) 和至少一个大写字符 (?=.*[A-Z])。这意味着也可以有 2 个大写字符。注意[A-Z]{1}可以写成[A-Z]

    如果只允许使用 1 个大写字母,您可能会匹配您的值而无需正向前瞻:

    ^[a-z]*[A-Z][a-z]*$

    Regex demo

    那会匹配:

    • ^断言字符串的开头
    • [a-z]* 匹配零次或多次 a - z
    • [A-Z] 匹配一次 A -Z
    • [a-z]* 匹配零次或多次 a - z
    • $断言字符串结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      相关资源
      最近更新 更多