如何重复一个捕获组?

3

我正在尝试编写一个用于验证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])";

请解释我错过了什么。

如果你想匹配 IP 地址中的 ".",你需要使用 "."。 - dustinroepsch
@WiktorStribiżew:第一个可以运行,第二个不行。我想写它的重复版本。{3}有什么问题吗? - Hooli
@DustinRyan-Roepsch 谢谢! - Hooli
1个回答

4
您的分组不正确:点号“\\。”是“25 [0-5]”生产的一部分,因此除非地址完全由“25x”组件组成,否则它不会在三部分组的中间匹配。
您的第一个正则表达式没有这个问题,因为点号是添加到分组括号之外的。但是,这些点号没有被转义,这意味着表达式将与一些不正确的字符串匹配(例如“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.


1
哇!!成功了。谢谢!而且我也明白了! - Hooli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接