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

Java 正则表达式内部标记匹配,java,regex,Java,Regex,从http响应中接收到的以下字符串: <res> <resultCode>100</resultCode> <resultText>OK</resultText> <sessionId>60698PLA1354274623024</sessionId> <sessionState>OPEN</sessionState> </res> 100

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

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

100
好啊
606981354274623024
打开
我正在尝试使用java提取sessionState(以及稍后的sessionId)

我尝试了以下正则表达式:

"object containing http response".matches("\<sessionState\>.*\</sessionState\>")
“包含http响应的对象”。匹配(\.\)
但我从来没有找到匹配的。我认为问题在于我在多行中得到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'
DEBUG[1]文本的ReplaceTags步骤:“{=var.code}”。匹配项(\\.\\”)是:“\r\n 100\r\n确定\r\n 60698PLA1354274623024\r\n打开\r\n”
调试执行代码:“\r\n 100\r\n确定\r\n 60698PLA1354274623024\r\n打开\r\n”。匹配(\\.\\”)
调试编译代码:
公共类EvalFunction105qhjmhjn3{
公共字符串eval(){
返回“+”\r\n 100\r\n确定\r\n 60698PLA1354274623024\r\n打开\r\n”。匹配项(\\.\\”;
}
}
调试评估执行返回结果:“false”

首先,我不认为你真的需要逃避你的
,我读过的任何文档都没有说你需要逃避


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

您可能需要使用matcher和pattern类,这两个类已经描述过了

下面是上述页面中的相关代码示例

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获取值

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

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

“HTTP响应对象”。匹配(“[\\s\\s]*.[\\s]*”;
我已经删除了您不必要的转义,并允许前面和后面的字符


编辑:为了解释换行符

为什么要转义<和>。您不需要。使用
xml解析器
…不
regex
…同意。这更难,但它工作正常。regex似乎只在简单的xml上工作。抱歉。在这种情况下,我被迫使用regex,因为我使用的是特定的java工具。我尝试了以下方法ing regex:\\.\\但是运气不好。也尝试过([^@user1866757如果你能保证你的XML不会向你扔曲线球,那么regex可以满足要求。只是不要告诉别人我告诉过你的。好吧,当你运行
“包含http响应的对象”。匹配(\.\\”)
将返回一个布尔值。您认为该布尔值是真的还是假的?“此外,String.matches方法只返回一个布尔值,告诉您的正则表达式是否包含在字符串中。”我知道这一点,这就是为什么该方法后面跟着:“{=var.result}”。replaceAll(\”,“”)。replaceAll(\”,“”)@user1866757请在不转义括号的情况下进行尝试,如
“包含http响应的对象”。匹配项(“.”)
<sessionState>([^<]*)</sessionState>
"HTTP response object".matches("[\\s\\S]*<sessionState>.*</sessionState>[\\s\\S]*");