为正则表达式中已定义的模式定义数字范围

时间:2019-06-25 13:45:48

标签: java regex

由于我很想念我在已经给出的答案中找不到的东西

我创建了一个正则表达式来满足这些要求:

  • 与任何数字或这些字母数字(_,-,空格)匹配的字符串
  • 此字符串的长度必须在3到23个字符之间。

我将匹配的正则表达式作为开头^[a-zA-Z0-9_ -]*$进行了补偿,该匹配通常符合第一个要求

现在,我更改*量词匹配项,以给出一定范围的数字,例如d {3,23},例如正则表达式会是

^[a-zA-Z0-9_ -]\d{3,23}$

好吧,它不匹配。请提供一些帮助,也需要一些解释。

2 个答案:

答案 0 :(得分:1)

我的猜测是,表达式中可能会有一个额外的\d,这也许行得通:

^[a-zA-Z0-9_ -]{3,23}$

答案 1 :(得分:1)

如果您只需要在3到24位数字之间匹配满足第一个要求的字符串,则需要在开始时SELECT id, data, ( SELECT COUNT(*) FROM table_name AS t2 WHERE t1.id = t2.id AND t1.data >= t2.data ) AS nth FROM table_name AS t1 HAVING nth = 2 前瞻:

(?=(?:\D*\d){3,23}\D*$)

因为在Java中^(?=(?:\D*\d){3,23}\D*$)[a-zA-Z0-9_ -]*$ 可以写为[a-zA-Z0-9_],所以可以安全使用

\w

要匹配空格,可以使用^(?=(?:\D*\d){3,23}\D*$)[\w -]*$ 代替常规空格:

\s

请参见regex demo(由于针对单个多行字符串测试了模式,因此已进行了修改)。

详细信息

  • ^(?=(?:\D*\d){3,23}\D*$)[\w\s-]*$ -字符串的开头
  • ^-必须有3到23个0+个非数字字符的序列,后跟一个数字,然后是字符串末尾的任何0+个非数字字符
  • (?=(?:\D*\d){3,23}\D*$)-0+个字母,数字,[\w\s-]*,空格和_字符
  • --到字符串的末尾。

Java用法示例:

$

请注意,boolean valid = s.matches("(?=(?:\\D*\\d){3,23}\\D*$)[\\w\\s-]*"); 需要完整的字符串匹配,因此锚点是多余的。