在第n个管道字符出现后匹配子字符串的正则表达式

我正在尝试为下面的示例文本构建一个正则表达式,我需要替换粗体文本。 到目前为止,我可以实现这一点((\|)).*(\|) ,它选择第一个和最后一个pip char之间的整个字符串。 我一定会使用apache或java正则表达式。

示例字符串:管道之间的文本长度可能不同

 1.1|ProvCM|111111111111|**10.15.194.25**|10.100.10.3|10.100.10.1|docsis3.0 

要在nth次出现管道后匹配部分,您可以使用此正则表达式:

 /^(?:[^|]*\|){3}([^|]*)/ 

这里n = 3

它将匹配组#1中的10.15.194.25

RegEx演示

 ^((?:[^|]*\\|){3})[^|]+ 

您可以使用此。替换$1$1演示。

https://regex101.com/r/tP7qE7/4

这里捕获从字符串的start| 然后捕获3个这样的组并将其存储在$1 。字符串的下一部分直到| 是你想要的。现在你可以用$1替换它。

以下是您可以进行更换的方法:

 String input = "1.1|ProvCM|111111111111|10.15.194.25|10.100.10.3|10.100.10.1|docsis3.0"; int n = 3; String newValue = "new value"; String output = input.replaceFirst("^((?:[^|]+\\|){"+n+"})[^|]+", "$1"+newValue); 

这构建:

 "1.1|ProvCM|111111111111|new value|10.100.10.3|10.100.10.1|docsis3.0"