2012-06-19 13 views
5

ho stringhe come questi:Java schema di espressione regolare con stringa opzionale

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

Quello che voglio in entrambi i casi è:

something something abcd blah blah 

Come faccio a fare questo utilizzando solo 1 schema di espressione regolare in Java? Posso fare il primo caso di questo:

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

Sembra che tu stia cercando di analizzare MediaWiki-Sintassi, forse un parser da http://www.mediawiki.org/wiki/Alternative_parsers sarebbe un'alternativa migliore in quanto MediaWiki presenta alcuni casi di limite. –

+0

Sembra una fonte utile. Grazie! – pckben

+0

Sweble sembra piuttosto bella: 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% 0Asquare + qualcosa +% 5B% 5Bxyz% 7Cabcd% 5D% 5D + blah + blah –

risposta

3

Aggiungere le seguenti:

  • Tutto tranne | zero o più volte: [^|]*
  • ... seguita da una |: |
  • ... facoltativamente: ?
  • Raggrupparlo utilizzando (?: ...) se non si desidera capt ure la cosa

Ecco un esempio completo:

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

uscita:

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

Grazie, accettando la tua risposta anziché la mia per la risposta rapida! – pckben

+0

... e cambia il replaceAll per usare $ 2, immagino. –

+0

@ Disco3, '(?: ...)' non cattura nulla. – aioobe

0

trovato io! \\[\\[(?:.+?\\|)?(.+?)\\]\\]

Problemi correlati