0

从我在 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'
4

3 回答 3

0

我认为您实际上并不需要首先逃脱<>,我读过的任何文档都没有说您需要。 这里有一些文档


此外,该String.matches方法仅返回一个布尔值,说明您的正则表达式是否包含在字符串中。

您可能想要使用在此网页上描述的匹配器和模式类。

这是来自所述页面的相关代码示例。

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,每个人都可能会跳到我身上

于 2012-11-30T16:25:17.943 回答
0

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

<sessionState>(.*)</sessionState>

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

此外,如果您不希望值中有任何左尖括号,我更喜欢这个正则表达式:

<sessionState>([^<]*)</sessionState>
于 2012-11-30T16:26:38.783 回答
0

尝试:

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

我已经删除了你有的不必要的转义,并允许前面和后面的字符。

编辑:考虑换行符

于 2012-11-30T16:51:22.897 回答