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メソッドは、正規表現が文字列に含まれているかどうかを示すブール値のみを返します。

At this web pageで説明されている 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 を完全に解析できないことを思い出させないと、誰もが私に飛びつくでしょう。

于 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 に答える