有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java匹配内部标记正则表达式

从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) 个答案

  1. # 1 楼答案

    我不认为你实际上首先需要逃避你的<>,我读过的任何文档都没有说你需要逃避there's some documentation here


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

    您可能需要使用matcher和pattern类,它们在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,每个人都可能会跳到我身上

  2. # 2 楼答案

    我认为您只需要使用这个正则表达式(不要跳过尖括号):

    <sessionState>(.*)</sessionState>
    

    然后使用捕获组1获取值

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

    <sessionState>([^<]*)</sessionState>
    
  3. # 3 楼答案

    尝试:

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

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

    编辑:考虑换行符