2012-06-19 25 views
5

tengo cadenas como éstas:patrón de expresión de Java con cadena opcional

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

Lo que quiero en ambos casos es:

something something abcd blah blah 

¿Cómo hacer esto utilizando sólo el 1 patrón de expresión en Java? Puedo hacer el primer caso con esto:

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

Parece que está tratando de analizar MediaWiki-Syntax - tal vez un analizador de http://www.mediawiki.org/wiki/Alternative_parsers sea una mejor alternativa ya que MediaWiki tiene bastantes casos extraños. –

+0

Parece una fuente útil. ¡Gracias! – pckben

+0

Sweble se ve bastante bien: 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% 0Asomething + something +% 5B% 5Bxyz% 7Cabcd% 5D% 5D + blah + blah –

Respuesta

3

Añadir los siguientes:

  • Cualquier cosa excepto | cero o más veces: [^|]*
  • ... seguido de un |: |
  • ... opcionalmente: ?
  • Agrúpelo utilizando (?: ...) si no desea capturar ure la cosa.

Aquí está un ejemplo 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")); 

Salida:

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

Gracias, aceptando su respuesta en lugar de la mía para la respuesta rápida! – pckben

+0

... y cambie el replaceAll para usar $ 2, supongo. –

+0

@ Disco3, el '(?: ...)' no captura nada. – aioobe

0

Encontrado yo mismo! \\[\\[(?:.+?\\|)?(.+?)\\]\\]

Cuestiones relacionadas