expresión regular de Java

Tengo una cuerda como esta

STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01|

y quiero extraer valores de algunas de las claves aquí.

como cuál es el valor de PNAM y SSTA.

Quiero una expresión regular que pueda proporcionar los valores de algunas de las claves y las claves pueden estar en cualquier orden.

preguntado el 16 de mayo de 11 a las 16:05

¿Cada tecla solo puede aparecer una vez? ¿Pueden los valores incluir el delimitador "|" -

¿No puedes simplemente dividir la cuerda? | y luego divida las partes en el =? -

los valores no tienen delimitador "|" y una clave aparece solo una vez. -

3 Respuestas

Utilice este código Java:

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01|";
Pattern p = Pattern.compile("([^=]*)=([^|]*)\\|");
Matcher m = p.matcher(str);
String pnamVal = null, sstaVal = null;
while (m.find()) {
    //System.out.println("Matched: " + m.group(1) + '=' + m.group(2));
    if (m.group(1).equals("PNAM"))
        pnamVal = m.group(2);
    else if (m.group(1).equals("SSTA"))
        sstaVal = m.group(2);

    if (pnamVal != null && sstaVal != null)
       break;
}
System.out.println("SSTA: " + sstaVal);
System.out.println("PNAM: " + pnamVal);

SALIDA

SSTA: 20110209 00:01:01
PNAM: test_.xml

contestado el 16 de mayo de 11 a las 21:05

Voy a usar tu expresión de esta manera ([PNAM | SSTA | STAR] *) = ([^ |] *) \\ | - cambiado

Seguro que puedes hacer que las expresiones regulares sean más restrictivas así. Solo una pequeña corrección, su expresión regular en ese caso debería ser "(PNAM|SSTA|STAR)=([^|]*)\\|" - anubhava

¿Algo como esto funcionaría para ti?

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("\\|");

for (String part : parts)
{
    String[] nameValue = part.split("=");

    if (nameValue[0] == "somekey")
    {
        // ..
    }
}

contestado el 16 de mayo de 11 a las 21:05

debe ser str.split ("\\ |"); o obtendrás resultados interesantes. - Plaza Adriano Varoli

No quiero dividir dos veces, ya que pueden ser 100 pares de claves y valores, y hacerlo de esta manera parece exagerar. - cambiado

En realidad, 100 pares parecen un cambio pequeño. - Plaza Adriano Varoli

Entonces, la forma en que su problema realmente no se resuelve mejor con expresiones regulares. En su lugar, use split () como alguien más lo ha ofrecido, pero en lugar de tener un bucle if loco, cargue todo en un mapa.

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("|");
Map<String, String> properties = new HashMap<String, String>();

for (String part : parts) {
    String[] nameValue = part.split("=");
    properties.put(nameValue[0], nameValue[1]);
}

Entonces todo lo que tienes que hacer es properties.get("PNUM")

contestado el 16 de mayo de 11 a las 21:05

Igual que otras respuestas basadas en división. | debe escaparse, de lo contrario, se dividirá en cada carácter de la cadena original (incluido el inicio y el final del texto). - anubhava

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.