2012-06-19 37 views
5

Tôi có chuỗi như thế này:Java mẫu regex với chuỗi tùy chọn

something something [[abcd]] blah blah 
something something [[xyz|abcd]] blah blah 

Những gì tôi muốn trong cả hai trường hợp là:

something something abcd blah blah 

Làm thế nào để làm điều này chỉ sử dụng 1 mẫu regex trong Java? Tôi có thể làm trường hợp đầu tiên với điều này:

Pattern pattern = Pattern.compile("\\[\\[(.+?)\\]\\]"); 
Matcher m = patternLinkRemoval.matcher(text); 
return m.replaceAll("$1"); 
+1

Dường như bạn đang cố gắng phân tích cú pháp MediaWiki-Cú pháp - có thể một trình phân tích cú pháp từ http://www.mediawiki.org/wiki/Alternative_parsers sẽ là một lựa chọn tốt hơn vì MediaWiki có khá nhiều trường hợp ngoại lệ. –

+0

Trông giống như một nguồn hữu ích. Cảm ơn! – pckben

+0

Sweble trông khá đẹp: http://sweble.org/crystalball/?wicket:interface=:11:query-form::IFormSubmitListener::&stage=POSTPRO&expMode=NOT_APPLICABLE&format=TEXT&query:wikitext=something+something+%5B%5Babcd% 5D% 5D + blah + blah% 0Một cái gì đó + một cái gì đó +% 5B% 5Bxyz% 7Cabcd% 5D% 5D + blah + blah –

Trả lời

3

Thêm dòng sau:

  • Bất cứ điều gì ngoại trừ | zero hoặc nhiều lần: [^|]*
  • ... theo sau là một |: |
  • ... tùy chọn: ?
  • Nhóm nó bằng cách sử dụng (?: ...) nếu bạn không muốn chụp ure điều.

Dưới đây là một ví dụ hoàn chỉnh:

String text1 = "something something [[abcd]] blah blah"; 
String text2 = "something something [[xyz|abcd]] blah blah"; 

Pattern pattern = Pattern.compile("\\[\\[(?:[^|]*\\|)?(.+?)\\]\\]"); 

System.out.println(pattern.matcher(text1).replaceAll("$1")); 
System.out.println(pattern.matcher(text2).replaceAll("$1")); 

Output:

something something abcd blah blah 
something something abcd blah blah 
+0

Cảm ơn bạn, chấp nhận câu trả lời của bạn thay vì câu trả lời nhanh của tôi! – pckben

+0

... và thay đổi replaceAll để sử dụng $ 2, tôi đoán vậy. –

+0

@ Disco3, '(?: ...)' không chụp bất kỳ thứ gì. – aioobe

0

Tìm thấy nó bản thân mình! \\[\\[(?:.+?\\|)?(.+?)\\]\\]

Các vấn đề liên quan