由于我很想念我在已经给出的答案中找不到的东西
我创建了一个正则表达式来满足这些要求:
我将匹配的正则表达式作为开头^[a-zA-Z0-9_ -]*$
进行了补偿,该匹配通常符合第一个要求
现在,我更改*量词匹配项,以给出一定范围的数字,例如d {3,23},例如正则表达式会是
^[a-zA-Z0-9_ -]\d{3,23}$
好吧,它不匹配。请提供一些帮助,也需要一些解释。
答案 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-]*");
需要完整的字符串匹配,因此锚点是多余的。