0

JSP を構築していますが、正規表現は初めてで、問題が発生しています。次のようなパターンの非常に長い文字列があります。

==SOME_ID== - item 1 - item 2 - item 3 .. item 100 == SOME_ID_2 == - item 1 - item 2 - item 3 ... item 100 == SOME_ID_3 == ...

したがって、「==」文字で囲まれた「識別子」の後に、ダッシュ「-」で区切られたリストが続きます。識別子とその項目要素を抽出しようとしています。文字列から情報を抽出したら、その情報を使用して XML ドキュメントを作成する予定です。

もう 1 つ注意してください。「アイテム」には複数の単語を指定できます。

編集:これまでの私のコードは次のとおりです

<%
String testStr = (String)pageContext.getAttribute("longStr");
String[] ids = null; 
String delimeterRegex = "(?i),==*==";
ids = testStr.split(delimeterRegex);
pageContext.setAttribute("ids", ids);
%>



<c:forEach items="${ids}" var="id">
    ${id}
</c:forEach>

どんな助けでも大歓迎です。ありがとうございました

4

2 に答える 2

2

次の正規表現を使用できます。

==([^=]+)==([^=]+)(?=(?:=|$))

この式は、等号の 2 つのペアの間の文字列をキャプチャ=し、文字列の次または最後まですべてを取得します。が最初のIDキャプチャ グループになります。データは2番目のものになります。グループは 0 からではなく 1 から番号が付けられます (グループ 0 は特別で、試合全体を表します)。

完全な例を次に示します。

String data = "==SOME_ID== - item 1 - item 2 - item 3 .. item 100 == SOME_ID_2 == - item 1 - item 2 - item 3 ... item 100 == SOME_ID_3 == ...";
Pattern p = Pattern.compile("==([^=]+)==([^=]+)(?=(?:=|$))");
    Matcher m = p.matcher(data);
while (m.find()) {
    System.out.println("ID="+m.group(1));
    System.out.println("Data="+m.group(2));
}

ideone のデモ。

ID=SOME_ID
Data= - item 1 - item 2 - item 3 .. item 100 
ID= SOME_ID_2 
Data= - item 1 - item 2 - item 3 ... item 100 
ID= SOME_ID_3 
Data= ...

data(ie )を取得したら、ダッシュgroup(2)で a を実行String.splitして、個々のデータ要素を分離できます。

于 2013-07-16T15:24:38.520 に答える
1

名前からその値の配列へのマップを作成するコードを次に示します。

Map<String, String[]> map = new HashMap<String, String[]>();
for (String mapping : input.split("(?<!^)(?===\\s*\\w+\\s*==)")) {
    String name = mapping.replaceAll("^==\\s*(\\w+).*", "$1");
    String[] values = mapping.replaceAll("^==\\s*\\w+\\s*==\\s*-*\\s*", "").split("\\s*-\\s*");
    map.put(name, values);
}

これは、「名前」に一致する先読みを使用して最初に分割します。先読みは非キャプチャであるため、次のステップのために名前を保持します。

次に、名前と値の文字列から名前の部分が抽出され、値の部分がダッシュで分割されます。すべての正規表現の一致は、ターゲットから空白が削除されるように行われます。

私はそれをテストしましたが、うまく機能します-名前と値の周りのオプションの空白を取り除きます。

于 2013-07-16T15:28:46.980 に答える