Tengo el siguiente código:

        Matcher title = Pattern.compile("<Title> (.+?)</Title>").matcher(epg); // for new dongle setup
//Matcher title = Pattern.compile("<Title> \"(.+?)\"</Title>").matcher(epg); // for old dongle setup

Tengo una respuesta xml en forma de cadena que estoy buscando analizar en el objeto matcher. El título estará en este formato:

<Title> "The Ellen DeGeneres Show"</Title>

O este formato:

<Title> The Ellen DeGeneres Show</Title>

Así que esencialmente es una diferencia de comillas. ¿Cómo puedo hacer mi declaración if para verificar esto antes de elegir qué método usar? Para resumir

if(pattern is with quotation marks){
Matcher title = Pattern.compile("<Title> \"(.+?)\"</Title>").matcher(epg);
} else if (pattern is without quotation marks){
Matcher title = Pattern.compile("<Title> (.+?)</Title>").matcher(epg)
}

No puedo entender qué poner en las declaraciones if.

2
Jvalant Dave 4 ene. 2017 a las 01:25

4 respuestas

La mejor respuesta

Por sugerencia de @UrosK, busqué cómo hacer que los personajes sean opcionales en Regex. Resulta que tengo que agregar un signo de interrogación después del personaje que me gustaría ser opcional. Ahora mi declaración tiene el siguiente aspecto:

Matcher title = Pattern.compile("<Title> \"?(.+?)\"?</Title>").matcher(epg);
2
Jvalant Dave 3 ene. 2017 a las 22:38

Intente escribir la expresión regular para las dos situaciones respectivas, y luego use el operador | para unirlas.

El siguiente es mi código:

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

public class RegexOptionalQuotationMarks {

    public static void main(String[] args) {
        String[] input = {
                "<Title> \"The Ellen DeGeneres Show\"</Title>"
                , "<Title> The Ellen DeGeneres Show</Title>"
        };

        String regexWithoutQm   = "<Title>\\s*\\w[^<]*</Title>";
        String regexWithQm      = "<Title>\\s*\"[^\"<]*\"\\s*</Title>";
        String regexBoth        = regexWithoutQm + "|" + regexWithQm;
        Pattern p = Pattern.compile(regexBoth);
        for (String s : input) {
            Matcher m = p.matcher(s);
            System.out.format("matching input %s ... %b%n", s, m.find());
        }

    }

}

El resultado de este programa fue este:

matching input <Title> "The Ellen DeGeneres Show"</Title> ... true
matching input <Title> The Ellen DeGeneres Show</Title> ... true
1
leeyuiwah 3 ene. 2017 a las 22:39

Simplemente puedes intentar

Matcher title = Pattern.compile("<Title>\\s*\"?([^\"]*)\"?</Title>").matcher(epg);

Para permitir cualquier cantidad de espacios (\ s) después de la etiqueta de apertura.

1
PNS 3 ene. 2017 a las 22:36

Intenta usar este código:

    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = domFactory.newDocumentBuilder();
    String xml = "<root><Title>test</Title></root>";
    Document dDoc = builder.parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));

    XPath xPath = XPathFactory.newInstance().newXPath();
    Node node = (Node) xPath.evaluate("//Title", dDoc, XPathConstants.NODE);
    System.out.println(node.getTextContent());

    final String text = node.getTextContent().trim();
    if(text.matches("^\\\".*\\\"$")){
        // Between double quotes
    }
    else{
        // No quotes
    }

Busque el nodo "Título" primero y luego verifique su contenido para el patrón

1
sergus 4 ene. 2017 a las 01:39