如何编写正则表达式以匹配IP地址的第三个八位字节

时间:2018-06-21 20:44:10

标签: regex string replace ip-address

我需要以以下格式更新CIDR范围(IP)的第三个八进制。

10.150.0.0/27

我只想匹配第三个八位位组,以便可以替换它。在这种情况下,它将是左边的第一个0。

4 个答案:

答案 0 :(得分:1)

以下正则表达式模式从0到9最多匹配3个数字,表示4个八位字节,并在末尾包含掩码。您所追求的是第三个八分位数附近的括号(捕获组)。

[0-9]{1,3}\.[0-9]{1,3}\.([0-9]{1,3})\.[0-9]{1,3}/[0-9]{1,2}

或更速记

\d{1,3}\.\d{1,3}\.(\d{1,3})\.\d{1,3}/\d{1,2}

在Java中,您将需要执行以下操作:

Pattern pattern = new Pattern.compile("[0-9]{1,3}\.[0-9]{1,3}\.([0-9]{1,3})\.[0-9]{1,3}/[0-9]{1,2}";
Matcher matcher = pattern.match("yourIPAddressHere") 
while (matcher.find()) {
    String thirdOctet = matcher.group(0); <--- the number of the matching group
}

从那里,您可以使用String.replace或任何您想修改原始IP的方式。希望这会有所帮助!

答案 1 :(得分:0)

\d{1,3}\.\d{1,3}\.(\d{1,3})\.\d{1,3}\/\d+将捕获该序列的第三部分。您可以使用regex.replace将其替换为其他内容。

如果您只想要该特定IP,那么它会更容易。 10\.150\.(\d+)\.0\/27

答案 2 :(得分:0)

这是您的Regex。请注意,它不会验证八位位组是否在范围内。

\d{1,3}\.\d{1,3}\.(\d{1,3})\.\d{1,3}\/\d+

这是使用捕获组()替换它的方法。

String ip = "10.150.0.0/27";
String pattern = "(\\d+\\.\\d+\\.)(\\d+)(\\.\\d+\\/\\d+)";
String newIp = ip.replaceAll(pattern,"$1" + "123" + "$3");

System.out.println(newIp); // prints 10.150.123.0/27

它如何工作?通过捕获组,我可以使用$字符和从1索引到特定组的数字临时存储和引用这些组。我想保留第一个和第三个,并用123替换第二个,得到"$1" + "123" + "$3"

为了简洁起见,我特意使用了上面的逐项版本。缩短的字符串类似于"$1123$3"

答案 3 :(得分:0)

您可以使用积极的前瞻来实现:

[0-9]+(?=\.[0-9]+\/)

签出this example