2016-05-31 16 views
0

Ich schreibe einen Testfall, wo meine Antwort von einem der folgenden beiden Formaten sein könnteRegexMuster Worte zum Abgleichen ohne Bestellung

<Amount currency="USD" xsi:Type="cc:MoneyType">"10.00"</Amount> 

oder

<Amount xsi:Type="cc:MoneyType" currency="USD">"10.00"</Amount> 

Und mein Code für die Suche nach dem currency Attribute Wert und den Wert der amount ist wie folgt,

Pattern pattern = Pattern.compile("<Amount currency=\"(\\S+)\" xsi:type=\"cc:Money\">(\\S+)</Amount>"); 
Matcher matcher = null; 
Double sumOfAmount = 0.0; 
String currency = null; 
matcher = pattern.matcher(response); 
while(matcher.find()) { 
    currency = matcher.group(1); 
    sumOfAmount += Double.valueOf(matcher.group(2)); 
} 

Aber diese Kabeljau E funktioniert nur für das erste Format der Antwort, wie soll ich es ändern, um zu arbeiten, um auch dem zweiten Typ des Formats zu entsprechen. Mit anderen Worten, ignorieren Sie die Reihenfolge der Attribute.

+2

Anstelle der String-Analyse mit regulären Ausdrücken können Sie die XML-Deserialisierung verwenden, in der Sie die Klassen Amount und Money definieren. Der Deserializer kümmert sich um das Erstellen von Objekten aus XML und Sie können direkt an Objekten arbeiten. MoneyType kann eine Enumeration sein, wenn Sie möchten –

+0

Sie sollten in Betracht ziehen, einen XML-Parser zu verwenden (qv [hier] (http://stackoverflow.com/questions/11863038/how-to-get-the-attribute-value-of-an- xml-node-using-java)), anstatt zu versuchen, eine komplexe Regex zu schreiben. –

Antwort

0

Wenn Sie nicht brauchen, mit der Art zu arbeiten, ich denke, das regex funktionieren soll:

"<Amount .*currency=\"(\\S+)\".*>(\\S+)</Amount>" 

Aber wenn Sie die Art benötigen, wäre es eine anspruchsvollere Art und Weise erfordern.

+0

Neben dieser Antwort stimme ich mit anderen comments, die Verwendung eines XML-Parser wäre eine bessere Lösung. –

0

können Sie Abwechslung, um es auftragsunabhängigen zu machen:

<Amount(?:\s+(?:currency="([^"]*)"|xsi:Type="([^"]*)"))+>([^<>]+)</Amount> 

... oder als Java Stringliteral:

"<Amount(?:\\s+(?:currency=\"([^\"]*)\"|xsi:Type=\"([^\"]*)\"))+>([^<>]+)</Amount>" 

aber bewusst sein, dass diese Regex Ihrem Beispiel zugeschnitten ist , wie Regexes immer sein müssen, wenn es um XML oder HTML geht. (Zum Beispiel berücksichtigt es nicht den optionalen Leerzeichen, das einfachste von vielen komplizierenden Problemen.) Für die Verarbeitung von XML sollten Sie wirklich einen dedizierten Parser verwenden.