如何重复捕获组?

时间:2016-07-11 18:43:10

标签: java regex

我正在尝试编写一个用于验证IP地址的正则表达式。

虽然这有效:

String reg = "((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5])";
public String pattern = reg + "." + reg + "." + reg + "." + reg;

这似乎不起作用,我不明白出了什么问题。

String pattern = "((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5]\\.){3}((0|1)?\\d{1,2}|2[0-4]\\d|25[0-5])";

请解释我错过了什么。

1 个答案:

答案 0 :(得分:4)

您没有正确分组:点\\.25[0-5]制作的一部分,因此除非地址仅由{25x生成,否则它不会在您的三部分组中间匹配{1}}组件。

您的第一个正则表达式不存在此问题,因为在分组括号外添加了点。但是,点不会被转义,这意味着表达式会匹配一些不正确的字符串以及正确的字符串(例如123a210b132c210

在数字制作周围添加括号可解决此问题:

(((0|1)?\d{1,2}|2[0-4]\d|25[0-5])\.){3}((0|1)?\d{1,2}|2[0-4]\d|25[0-5])
//^                             ^

Demo.