2012-11-30 52 views
0

從下面的字符串,我在HTTP響應receieve:匹配標籤內的正則表達式

<res> 
    <resultCode>100</resultCode> 
    <resultText>OK</resultText> 
    <sessionId>60698PLA1354274623024</sessionId> 
    <sessionState>OPEN</sessionState> 
</res> 

我想提取的sessionState(以及後來的sessionId)用java

我試過下面的正表達:

"object containing http response".matches("\<sessionState\>.*\</sessionState\>") 

但我從來沒有得到一個匹配。我認爲問題是,我得到了多行(我已經嘗試添加\ n \ S,但沒有運氣)HTTP響應。

任何幫助表示讚賞,謝謝。

這是輸出我建議正則表達式得到:

DEBUG [1] ReplaceTags STEP for text: '"{=var.code}".matches("\\<sessionState \\>.*\\</sessionState\\>")' is: '"<res>\r\n <resultCode>100</resultCode>\r\n <resultText>OK</resultText>\r\n <sessionId>60698PLA1354274623024</sessionId>\r\n <sessionState>OPEN</sessionState>\r\n</res>' 

DEBUG Executing code: "<res>\r\n <resultCode>100</resultCode>\r\n <resultText>OK</resultText>\r\n <sessionId>60698PLA1354274623024</sessionId>\r\n <sessionState>OPEN</sessionState>\r\n</res>".matches("\\<sessionState\\>.*\\</sessionState\\>") 

DEBUG Compiling code: 
public class EvalFunction105qhjmhjn3 { 
public String eval() { 
    return "" + "<res>\r\n <resultCode>100</resultCode>\r\n  <resultText>OK</resultText>\r\n <sessionId>60698PLA1354274623024</sessionId>\r\n <sessionState>OPEN</sessionState>\r\n</res>".matches("\\<sessionState\\>.*\\</sessionState\\>"); 
} 
} 

DEBUG Eval execution returned result: 'false' 
+0

爲什麼你逃脫< and >。你不需要。 –

+0

使用'xml parser' ...不是'regex' ... – Anirudha

+0

同意。這很難,但它工作正常。正則表達式似乎只適用於簡單的xml。抱歉。 – dashrb

回答

0

我不認爲你確實需要逃避你<>擺在首位,沒有我讀過文件說你需要。 there's some documentation here


此外,String.matches方法只返回一個布爾值,告訴你的正則表達式是否被包含的字符串中。

你可能會想要使用匹配器和模式類,它們被描述爲At this web page

以下是來自所述頁面的相關代碼示例。

package de.vogella.regex.test; 

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

public class RegexTestPatternMatcher { 
    public static final String EXAMPLE_TEST = "This is my small example string which I'm going to use for pattern matching."; 

    public static void main(String[] args) { 
    Pattern pattern = Pattern.compile("\\w+"); 
    // In case you would like to ignore case sensitivity you could use this 
    // statement 
    // Pattern pattern = Pattern.compile("\\s+", Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(EXAMPLE_TEST); 
    // Check all occurance 
    while (matcher.find()) { 
     System.out.print("Start index: " + matcher.start()); 
     System.out.print(" End index: " + matcher.end() + " "); 
     System.out.println(matcher.group()); 
    } 
    // Now create a new pattern and matcher to replace whitespace with tabs 
    Pattern replace = Pattern.compile("\\s+"); 
    Matcher matcher2 = replace.matcher(EXAMPLE_TEST); 
    System.out.println(matcher2.replaceAll("\t")); 
    } 
} 

而且,每個人都可能會跳到我,如果我不提醒你,正則表達式並不能真正解析XML

+0

我在這種情況下被迫使用正則表達式,因爲我正在使用特定的java工具。 我試過以下正則表達式: \\ 。* \\ 但沒有運氣。 也試過 <的sessionState>([^ <] *) 也沒有運氣:\ – user1866757

+0

@ user1866757如果你能保證你的XML不會朝你扔曲線球,然後正則表達式可以滿足要求。只是不要告訴其他人,我告訴過你。 –

+0

好吧,當你運行'「包含http響應的對象」.matches(「\ 。* \」)時,將返回一個布爾值。那是布爾值嗎?或者它是假的? –

0

我想你只需要使用這個表達式(不逃避尖括號):

<sessionState>(.*)</sessionState> 

然後使用捕獲組1獲得該值。

另外,如果你不希望在價值的開角括號,我更喜歡這樣的正則表達式:

<sessionState>([^<]*)</sessionState> 
0

嘗試:

"HTTP response object".matches("[\\s\\S]*<sessionState>.*</sessionState>[\\s\\S]*"); 

我已經刪除你有多餘的逃逸並允許前後的字符。

編輯:考慮換行符