2010-04-14 22 views
5

tengo esta cadena:cómo leer la parte de cadena en Java

<meis xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" uri="localhost/naro-nei" onded="flpSW531213" identi="lemenia" id="75" lastStop="bendi" xsi:noNamespaceSchemaLocation="http://localhost/xsd/postat.xsd xsd/postat.xsd"> 

¿Cómo puedo obtener lastStop valor de la propiedad en JAVA?

Esta expresión regular trabajó cuando se prueba en http://www.myregexp.com/

Pero cuando lo intento en Java no veo el texto coincidente, aquí es cómo me trató:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class SimpleRegexTest { 
    public static void main(String[] args) { 
     String sampleText = "<meis xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" uri=\"localhost/naro-nei\" onded=\"flpSW531213\" identi=\"lemenia\" id=\"75\" lastStop=\"bendi\" xsi:noNamespaceSchemaLocation=\"http://localhost/xsd/postat.xsd xsd/postat.xsd\">"; 
     String sampleRegex = "(?<=lastStop=[\"']?)[^\"']*"; 
     Pattern p = Pattern.compile(sampleRegex); 
     Matcher m = p.matcher(sampleText); 
     if (m.find()) { 
      String matchedText = m.group(); 
      System.out.println("matched [" + matchedText + "]"); 
     } else { 
      System.out.println("didn’t match"); 
     } 
    } 
} 

Tal vez el problema es que yo Use escape char en mi prueba, pero la cuerda real no tiene escape dentro. ?

ACTUALIZACIÓN

¿Alguien sabe por qué esto no funciona cuando se utiliza en java? o cómo hacer que funcione?

+0

El problema es el segundo '?' (El que está después del grupo de caracteres). Dado que la entrada parece ser XML, las comillas no son opcionales de todos modos, por lo que su eliminación no es un problema y hace que la expresión regular funcione. –

+0

@Joachim Sauer La entrada no es xml es una parte de un archivo xml que se grabó en String. –

+0

eso es suficiente. El hecho de que fuera parte de un archivo XML (y supongo que estaba bien formado) significa que los atributos ** deben ** ser citados. –

Respuesta

3
(?<=lastStop=[\"']?)[^\"]+ 
+0

@ Hun1Ahpu tnx, lo probé en http://www.myregexp.com/ no funciona. –

+0

intente de nuevo sin la agrupación con el nombre – Hun1Ahpu

+0

@ Hun1Ahpu ¿cómo podría hacer eso? –

2

La razón por la que no funciona como se espera se debe a la * en [^\"']*. El lookbehind coincide en la posición antes de" en lastStop=", lo cual está permitido porque la cita es opcional: [\"']?. La siguiente parte se supone que coincide con cero o más caracteres sin comillas, pero dado que el siguiente carácter es, no coincide con ningún carácter.

Si cambia ese * a +, la segunda parte no coincidirá en esa posición, lo que obligará al motor regex a avanzar una posición más. El lookbehind coincidirá con la cita, y [^\"']+ coincidirá con lo siguiente. Sin embargo, realmente no deberías estar usando un lookbehind para esto en primer lugar. Es mucho más fácil simplemente coincidir con toda la secuencia de la forma habitual y extraer la parte que desea conservar a través de un grupo de captura:

String sampleRegex = "lastStop=[\"']?([^\"']*)"; 
Pattern p = Pattern.compile(sampleRegex); 
Matcher m = p.matcher(sampleText); 
if (m.find()) { 
    String matchedText = m.group(1); 
    System.out.println("matched [" + matchedText + "]"); 
} else { 
    System.out.println("didn’t match"); 
} 

que también hará que sea más fácil tratar con el problema @Kobi mencionado. Está intentando permitir valores contenidos entre comillas dobles, comillas simples o sin comillas, pero su expresión regular es demasiado simplista. Por un lado, un valor cotizado puede contener espacios en blanco, pero uno no citado no puede. Para lidiar con las tres posibilidades, necesitará dos o tres grupos de captura, no solo uno.

+0

Tus puntos pueden ser válidos Realmente no lo sé, pero tu expresión regular no funciona, pruébalo. Obtengo este resultado 'lastStop =" bendi' en lugar de 'bendi' –

+0

Me funciona. Observe que llamo' m.group (1) ', no' m.group() '. –

+0

cuál es la diferencia entre estas 2 llamadas? –

Cuestiones relacionadas