Java regular expression examples


Tengo un problema con unos servicios web que me devuelven mal el xml. Cree un Interceptor para ponerlo bien. Pero es que son tan cachondos los del lado del servidor que la premisa me va cambiando.
Error inicial: axis2ns104:Server
Siguiente vez: axis2ns105:Server

Solucion Regex:

.*(axis2ns)(\d{4}|\d{3}|\d{2}|\d{1}):Server.*"
.*(axis2ns)([0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1}):Server.*
	public static final String EXAMPLE_TEST = "<?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><soapenv:Fault><faultcode xmlns:axis2ns105="http://schemas.xmlsoap.org/soap/envelope/">" +
			"axis2ns105:Server</faultcode><faultstring>0229 La petición ya ha sido tramitada</faultstring><detail><Atributos xmlns="http://www.map.es/scsp/esquemas/V2/soapfaultatributos"><IdPeticion>00000207</IdPeticion><TimeStamp>2014-02-24T16:37:04.967+01:00</TimeStamp><NumElementos>1</NumElementos><Estado><CodigoEstado>0229</CodigoEstado><CodigoEstadoSecundario /><LiteralError>La petición ya ha sido tramitada</LiteralError><TiempoEstimadoRespuesta>0</TiempoEstimadoRespuesta></Estado><CodCertificado>CDISFWS01</CodCertificado></Atributos></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>";
	public static void main(String[] args) {
		System.out.println(EXAMPLE_TEST.matches(".*(axis2ns)(\d{4}|\d{3}|\d{2}|\d{1}):Server.*"));
		System.out.println(EXAMPLE_TEST.matches(".*(axis2ns)([0-9]{4}|[0-9]{3}|[0-9]{2}|[0-9]{1}):Server.*"));
	}

Asi es como queda en mi interceptor. Con el codigo de antes simplemente sabemos que existe una coincidencia. Pero no sabemos cual. Con el siguiente codigo, descubrimos las posibles coincidencias y transformamos la cadena.

	if((currentEnvelope != null) && (currentEnvelope.matches(".*(axis2ns)(\d{4}|\d{3}|\d{2}|\d{1}):Server.*"))){
		Pattern MY_PATTERN = Pattern.compile("(axis2ns)(\d{4}|\d{3}|\d{2}|\d{1})");
		Matcher m = MY_PATTERN.matcher(currentEnvelope);
		String res = "";
		while (m.find()) {
			res= m.group();
		}
		if( ! res.equals("")){
			LOGGER.info("Debido a un bug en el mensaje SoapFault de este servicio. se procede a cambiar la etiqueta ""+res+"" por "soapenv".");
			currentEnvelope = currentEnvelope.replace(res, "soapenv");
		}
	}

Mirando por internet Vogella tiene un error, desde mi punto de vista. En un momento de su tutorial dice que

 // returns true if the string contains a number less then 300
  public boolean isLessThenThreeHundret(String s){
    return s.matches("[^0-9]*[12]?[0-9]{1,2}[^0-9]*");
  }

yo digo que eso esta mal que es:

 // returns true if the string contains a number less then 300
  public boolean isLessThenThreeHundret(String s){
    return s.matches("[012]{1}[0-9]{1,2}");
  }
Anuncios
Java regular expression examples