当前位置: 首页 > 面试题库 >

正则表达式精确匹配n个字母出现和m个数字出现

壤驷穆冉
2023-03-14
问题内容

我必须匹配一个8字符串,该字符串可以包含正好2个字母(1个大写字母和1个小写字母)以及正好6个数字,但是它们可以任意排列。

因此,基本上:

  • K82v6686将通过
  • 3w28E020会通过
  • 1276eQ900会失败(时间太长)
  • 98Y78k9k会失败(三个字母)
  • A09B2197将会失败(两个大写字母)

我尝试使用正向前瞻来确保该字符串包含数字,大写和小写字母,但是在将其限制为一定数目的出现时遇到了麻烦。我想我可以通过包括字母和数字可能出现的位置的所有可能组合来解决这个问题:

(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]) ([A-Z][a-z][0-9]{6})|([A-Z][0-9][a-z][0-9]{5})| ... | ([0-9]{6}[a-z][A-Z])

但这是一种非常round回的方式,我想知道是否有更好的解决方案


问题答案:

您可以使用

^(?=[^A-Z]*[A-Z][^A-Z]*$)(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

参见regex演示(由于多行输入而有些修改)。在Java中,不要忘记使用双反斜杠(例如\\d,匹配一个数字)。

这是一个细分:

  • ^ -字符串的开头(假设不使用多行标志)
  • (?=[^A-Z]*[A-Z][^A-Z]*$)-检查是否只有1个大写字母(用于\p{Lu}匹配任何Unicode大写字母和\P{Lu}其他字符)
  • (?=[^a-z]*[a-z][^a-z]*$)-类似检查是否只有1个小写字母(或者使用\p{Ll}\P{Ll}匹配Unicode字母)
  • (?=(?:\D*\d){6}\D*$)-检查字符串中是否有六个数字(=从字符串的开头开始,可以有0个或多个非数字符号(\D匹配除数字以外的任何字符,也可以将其替换为[^0-9]),然后再跟一个数字(\d),然后是0或多个非数字字符(\D*),直到字符串($)的末尾,然后
  • [a-zA-Z0-9]{8} -精确匹配8个字母数字字符。
  • $ -字符串结尾。

按照逻辑,我们甚至可以将其简化为

^(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

可以删除一个条件,因为我们只允许使用大小写字母和数字[a-zA-Z0-9],并且当我们应用2个条件时, 匹配
字符串时会自动执行第三个条件(在这种情况下,一个字符必须为大写)。

当将它与Java matches()方法一起使用时^,无需$在模式的开头和结尾处使用和定位符,但是在前瞻中仍然需要它:

String s = "K82v6686";
String rx = "(?=[^a-z]*[a-z][^a-z]*$)" +      // 1 lowercase letter check
            "(?=(?:\\D*\\d){6}\\D*$)" +       // 6 digits check
            "[a-zA-Z0-9]{8}";                 // matching 8 alphanum chars exactly
if (s.matches(rx)) {
    System.out.println("Valid"); 
}


 类似资料:
  • 要匹配至少包含一个字母或数字的字符串,JavaScript正则表达式是什么?这至少需要一个字母数字字符(至少一个字母或至少一个数字)。

  • 问题内容: 我需要将Python中的一个表达式与仅匹配偶数个字母出现的正则表达式进行匹配。例如: 偶数应匹配。 问题答案: 试试这个正则表达式: 并且如果s不需要是连续的:

  • 我需要在以下条件下使用C#中的正则表达式匹配字符串: 整个字符串只能是字母数字(包括空格) 最大长度不得超过15个字符(包括空格) 首先 如果这些先决条件中的任何一个被打破,比赛就不会进行。 以下是我目前掌握的情况: 下面是一些应该匹配的测试字符串: 堆栈溢出 伊姆特最伟大的 一个 超人23s 一二三 还有一些不应该匹配的(注意空格): 堆叠 [double_space] 溢流岩石 23你好 这是

  • 问题内容: 我有以下字符串: 如您所见,该字符串由#分隔。我的用例类似于一个简单的SPLIT(string,“#”)操作,但是regex给了我更多的灵活性。 我想匹配两次出现的#之间的字符。例如,第二次和第三次出现之间的字符应匹配:“ US” 我使用的是Google Bigquery,能够匹配字符串的前两个术语,但与第三个术语比较费劲: 位置是字符串,例如上面的字符串。 我已经找到了这个问题,但是

  • 问题内容: 如何检查整个字符串是否可以与正则表达式匹配?在Java中是方法 问题答案: 您需要结合使用锚(字符串锚的开始)和字符串锚的结束,并通过以下选项进行操作: 或者,您可以传递一个选项数组,其中仅将模式锚定在字符串的开头,您可以省略,但仍然需要锚定在字符串末尾: 观看在线Swift演示 另外,在此处使用with 是一种替代方法: 根据ICU v3,使用正则表达式样式的比较,左手表达式等于右手

  • 本文向大家介绍Java正则表达式过滤出字母、数字和中文,包括了Java正则表达式过滤出字母、数字和中文的使用技巧和注意事项,需要的朋友参考一下 1、Java中过滤出字母、数字和中文的正则表达式 (1)过滤出字母的正则表达式       [^(A-Za-z)] (2) 过滤出 数字 的正则表达式    [^(0-9)] (3) 过滤出 中文 的正则表达式        [^(\\u4e00-\\u9