Regex 单个匹配中的正则表达式计数
我想检查字符串的数字是否不超过5个。我可以这样做:Regex 单个匹配中的正则表达式计数,regex,Regex,我想检查字符串的数字是否不超过5个。我可以这样做: Matcher matcher = Pattern.compile("\\d").matcher(val); i = 0; while (matcher.find()) { i++; } 不过,我希望不用花时间就可以完成(因为我们使用的是regex验证框架)。 我希望能够像这样匹配字符串 A2sad..3f,3,sdasad2..2尝试以下正则表达式: ^\D*(?:\d\D*){0,5}$ \d是一个单个数字,而\d是该数字的补码
Matcher matcher = Pattern.compile("\\d").matcher(val);
i = 0;
while (matcher.find()) {
i++;
}
不过,我希望不用花时间就可以完成(因为我们使用的是regex验证框架)。
我希望能够像这样匹配字符串
A2sad..3f,3,sdasad2..2
尝试以下正则表达式:
^\D*(?:\d\D*){0,5}$
\d
是一个单个数字,而\d
是该数字的补码,因此除了数字以外的任何字符都可以(?:…)
与普通分组类似,只是其子匹配项不能被引用
此正则表达式允许在开始处使用任何非数字字符,后跟最多五个单位数序列,后跟可选的非数字字符。尝试此正则表达式:
^\D*(?:\d\D*){0,5}$
\d
是一个单个数字,而\d
是该数字的补码,因此除了数字以外的任何字符都可以(?:…)
与普通分组类似,只是其子匹配项不能被引用
此正则表达式允许在开始处使用任何非数字字符,后跟最多五个单位数序列,后跟可选的非数字字符。此正则表达式匹配最多包含5个数字的字符串:
^(\D*\d){0,5}\D*$
如果要匹配正好由5位数字组成的字符串,请执行以下操作:
^(\D*\d){5}\D*$
请注意,在java.lang.String文本中,需要转义反斜杠:
boolean match = "A2sad..3f,3,sdasad2..2".matches("(\\D*\\d){0,5}\\D*");
或:
您不需要添加“锚定”
^
和$
,因为Java的匹配(…)
已经对字符串进行了完全匹配。此正则表达式匹配最多包含5位数字的字符串:
^(\D*\d){0,5}\D*$
如果要匹配正好由5位数字组成的字符串,请执行以下操作:
^(\D*\d){5}\D*$
请注意,在java.lang.String文本中,需要转义反斜杠:
boolean match = "A2sad..3f,3,sdasad2..2".matches("(\\D*\\d){0,5}\\D*");
或:
您不需要添加“锚定”
^
和$
,因为Java的匹配(…)
已经对字符串进行了完全匹配。一种方法是使用负前瞻:
^(?!(?:\D*\d){6})
一种方法是使用消极前瞻:
^(?!(?:\D*\d){6})
@巴特·K:你怎么会这么想?它在语义上等同于你的。@Bart K:它也会匹配0-4个数字。开头有个a\D*。谢谢,我选择接受巴特K。因为这是最容易理解的。@巴特K:你怎么会这么想?它在语义上等同于你的。@Bart K:它也会匹配0-4个数字。开头有a\D*。谢谢,我选择接受Bart K。因为它最容易理解。我想这就是作者想要的。他只是想确保不超过5位数字。不过,我会将(\d*\d)改为使用非捕获组。速度快了一点(虽然几乎可以忽略不计)。@01,是的,这就是为什么我说“最多5位数”。如果您需要精确匹配5位数字,请将
{0,5}
替换为{5}
@reko_t,是的,因为它很可能可以忽略不计,为了便于可读,我省略了它。我想这是作者想要的。他只是想确保不超过5位数字。不过,我会将(\d*\d)改为使用非捕获组。速度快了一点(虽然几乎可以忽略不计)。@01,是的,这就是为什么我说“最多5位数”。如果需要精确匹配5位数字,请将{0,5}
替换为{5}
@reko_t,是的,因为它很可能可以忽略不计,为了便于可读,我省略了它。