匹配内部标签正则表达式

时间:2012-11-30 16:20:41

标签: java regex

从我在http响应中收到的以下字符串:

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

我正在尝试使用java

提取sessionState(以及稍后的sessionId)

我尝试过遵循正则表达式:

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

但我从未得到过匹配。我认为问题是我在多行中得到了http响应(我尝试添加\ n \ s但没有运气)。

感谢任何帮助,谢谢。

这是我使用推荐的正则表达式获得的输出:

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'

3 个答案:

答案 0 :(得分:0)

我认为你实际上并不需要首先逃离<>,我读过的文档中没有你需要的文件。 there's some documentation here


此外,String.matches方法只返回一个bool,告诉你的正则表达式是否包含在字符串中。

你可能想要使用匹配器和模式类,它们被描述为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,那么每个人都可能会跳到我身上

答案 1 :(得分:0)

我认为你只需要使用这个正则表达式(不要逃避尖括号):

<sessionState>(.*)</sessionState>

然后使用捕获组1获取值。

另外,如果你不希望值中有任何开口尖括号,我更喜欢这个正则表达式:

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

答案 2 :(得分:0)

尝试:

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

我已删除了您不必要的转义,并允许使用前置和尾随字符。

编辑:考虑换行符