0

我知道有很多与此主题相关的问题,即正则表达式,但我一直在尝试满足 URL 的要求。网址如下:

POST /fr.synomia.search.ws.module.ModuleSearch/geResults/jsonp?xmlQuery=<?xml version='1.0' encoding='UTF-8'?><query ids="16914"><matchWord>avoir</matchWord><fullText><![CDATA[]]></fullText><quotedText><![CDATA[]]></quotedText><sensitivity></sensitivity><operator>AND</operator><offsetCooc>0</offsetCooc><cooc></cooc><collection>0</collection><searchOn>all</searchOn><nbResultDisplay>10</nbResultDisplay><nbResultatsParAspect>5</nbResultatsParAspect><nbCoocDisplay>8</nbCoocDisplay><offsetDisplay>0</offsetDisplay><sortBy>date</sortBy><dateAfter>0</dateAfter><dateBefore>0</dateBefore><ipClient>82.122.169.244</ipClient><typeQuery>0</typeQuery><equivToDelete></equivToDelete><allCooc>false</allCooc><versionDTD>3.0.5</versionDTD><r34>1tcbet30]</r34><mi>IND</mi></query>&callback=__gwt_jsonp__.P1.onSuccess&failureCallback=__gwt_jsonp__.P1.onFailure HTTP/1.1

它是一个向 REST WS 请求的 URL,在这个 url 的结构中,我们可以找到一个标签:<query ids="16914">

我想从整个 URL 中提取数字 16914,我尝试实现的正则表达式如下:

private static Pattern p = Pattern.compile(
"<\\?xml version='1.0' encoding='[^']+'\\?><query ids=\"([0-9]+)\"><matchWord>.*");

我尝试了一些工具,如 Debuggex,但我无法找到可能的问题,我更喜欢使用正则表达式而不是使用 String 类中的许多方法。

我真的很感激任何帮助。提前非常感谢。

4

2 回答 2

1

我会为此目的使用 SAX:

public class XMLParser extends DefaultHandler {
   int id;
   public void startElement(String ns, String qName, String localName, Attributes attrs) throws SAXException {
     if (qName.equals("query")) { 
        id = Integer.parseInt(attrs.getValue("id"));
     }
   }
   public String toString() { 
     return String.format("%d", this.id); 
   }
   public static void main(String[] args) throws Exception {
     SAXParserFactory factory = SAXParserFactory.newInstance();
     SAXParser parser = factory.newSAXParser();
     XMLParser parserObj = new XMLParser();
     parser.parse(new FileReader(args[0], parserObj);
     System.out.println(parserObj);
  }
}
于 2013-05-28T15:22:54.597 回答
1

您的正则表达式没有任何问题,它对我有用。

String s = "POST /fr.synomia.search.ws.module.ModuleSearch/geResults/jsonp?xmlQuery=<?xml version='1.0' encoding='UTF-8'?><query ids=\"16914\"><matchWord>avoir</matchWord><fullText><![CDATA[]]></fullText><quotedText><![CDATA[]]></quotedText><sensitivity></sensitivity><operator>AND</operator><offsetCooc>0</offsetCooc><cooc></cooc><collection>0</collection><searchOn>all</searchOn><nbResultDisplay>10</nbResultDisplay><nbResultatsParAspect>5</nbResultatsParAspect><nbCoocDisplay>8</nbCoocDisplay><offsetDisplay>0</offsetDisplay><sortBy>date</sortBy><dateAfter>0</dateAfter><dateBefore>0</dateBefore><ipClient>82.122.169.244</ipClient><typeQuery>0</typeQuery><equivToDelete></equivToDelete><allCooc>false</allCooc><versionDTD>3.0.5</versionDTD><r34>1tcbet30]</r34><mi>IND</mi></query>&callback=__gwt_jsonp__.P1.onSuccess&failureCallback=__gwt_jsonp__.P1.onFailure HTTP/1.1";
Pattern p = Pattern.compile(
            "<\\?xml version='1.0' encoding='[^']+'\\?><query ids=\"([0-9]+)\"><matchWord>.*");

Matcher m = p.matcher(s);

if (m.find()) {
    System.out.println("Group: "+m.group(1));
}

印刷:

Group: 16914
于 2013-05-28T15:24:58.583 回答