2015-05-13 24 views
6

tôi đang cố gắng tạo một biểu thức chính quy cho văn bản mẫu bên dưới mà tôi cần thay thế văn bản đậm. Cho đến nay tôi có thể đạt được điều này nhiều ((\|)).*(\|) đang chọn toàn bộ chuỗi giữa pip đầu tiên và cuối cùng. tôi bị ràng buộc để sử dụng apache hoặc regex java.regex để đối sánh chuỗi con sau sự xuất hiện thứ n của ký tự ống

mẫu String: nơi độ dài văn bản giữa ống có thể thay đổi

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

chuỗi đậm 10.15.194.25, nhờ :) – Ramesh

Trả lời

11

Để phù hợp với phần sau nth xảy ra ống bạn có thể sử dụng regex này:

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

đây n = 3

Nó sẽ khớp với 10.15.194.25 trong nhóm phù hợp # 1

RegEx Demo

+0

nhờ anubhava, này phù hợp để 10.15.194.25 | 10.100 .10.3 | 10.100.10.1 | docsis3.0. Tôi chỉ cần chuỗi 10.15.194.25 trong số đó. – Ramesh

+0

Không, nó chỉ phù hợp với '10.15.194.25' Bạn có kiểm tra bản demo mới nhất không? – anubhava

+1

Có vẻ ổn; java: 's = s.replaceFirst ("^(?: [^ |] * \\ |) {3} ([^ |] *) \\ |. * $ "," $ 1 ");' –

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

Bạn có thể sử dụng this.Replace bởi $1<anything> .See demo.

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

đây này chụp từ start của chuỗi để | và sau đó chụp 3 nhóm và lưu trữ nó như vậy trong $1 .Công phần tiếp theo của chuỗi đến | là những gì bạn want.Now bạn có thể thay thế nó với bất cứ điều gì bởi $1<textyouwant>.

+0

cảm ơn, dường như đang hoạt động. bạn có thể vui lòng giúp giải thích điều này trong ngắn gọn – Ramesh

+0

Hoàn hảo, cảm ơn vì lời giải thích rõ ràng, nhờ @vks để sửa lỗi. – Ramesh

0

Đây là cách bạn có thể làm việc thay thế:

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); 

này được xây dựng:

"1.1|ProvCM|111111111111|new value|10.100.10.3|10.100.10.1|docsis3.0" 
Các vấn đề liên quan