2015-05-13 3 views
6

Я пытаюсь построить одно выражение регулярного выражения для текста нижеприведенного текста, в котором мне нужно заменить полужирным шрифтом. До сих пор я мог достичь этой цели ((\|)).*(\|), которая выбирает целую строку между первым и последним символами. Я должен использовать apache или java regex.regex, чтобы соответствовать подстроке после n-го появления символа трубы

Образец Строка: где длина текста между трубами может варьироваться в

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

смелой строка 10.15.194.25, спасибо :) – Ramesh

ответ

11

Чтобы соответствовать части после nth возникновения трубы вы можете использовать это регулярное выражение:

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

Здесь п = 3

Он будет соответствовать 10.15.194.25 в соответствующей группе # 1

RegEx Demo

+0

спасибо анубхаву, это соответствует к 10.15.194.25 | 10.100 .10.3 | 10.100.10.1 | docsis3.0. Мне просто нужна строка 10.15.194.25. – Ramesh

+0

Нет, он только соответствует '10.15.194.25' Вы проверили последнюю демо? – anubhava

+1

Выглядит хорошо; java: 's = s.replaceFirst ("^(?: [^ |] * \\ |) {3} ([^ |] *) \\ |. * $ "," $ 1 ");' –

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

Вы можете использовать this.Replace по $1<anything> .Увидь демо.

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

Это здесь захватывает от start строки в |, а затем захватывает 3 такие группы и сохраняет его в $1 .The следующей части строки до | является то, что вы want.Now вы можете заменить его на что-нибудь на $1<textyouwant>.

+0

спасибо, похоже, работает. пожалуйста, помогите объяснить это кратким – Ramesh

+0

Отлично, спасибо за чистое объяснение, спасибо @vks за исправление. – Ramesh

0

Вот как вы можете сделать замену:

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" 
Смежные вопросы