1

次のようなものに一致する正規表現を取得する必要があります:

1234 <CIRCLE> 12 12 12 </CIRCLE>

1234 <RECTANGLE> 12 12 12 12 </RECTANGLE>

私はこの正規表現を書くためにやって来ました:

(\\d+?) <([A-Z]+?)> (\\d+?) (\\d+?) (\\d+?) (\\d*)? (</[A-Z]+?>)

長方形を一致させようとしているときはうまく機能しますが、円では機能しません

問題は、私の5番目のグループがキャプチャしていないことです??

4

5 に答える 5

1

試す

(\\d+?) <([A-Z]+?)> (\\d+?) (\\d+?) (\\d+?) (\\d+ )?(</[A-Z]+?>)

(最後の「\d」グループを変更して、スペースもオプションにしました。)

于 2014-09-23T21:45:16.773 に答える
0

数字だけの解決策:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Nonnull;

public class Q26005150
{
    private static final Pattern P = Pattern.compile("(\\d+)");

    public static void main(String[] args)
    {
        final String s1 = "1234 <CIRCLE> 12 12 12 </CIRCLE>";
        final String s2 = "1234 <RECTANGLE> 12 12 12 12 </RECTANGLE>";

        final List<Integer> l1 = getAllMatches(s1);
        final List<Integer> l2 = getAllMatches(s2);

        System.out.println("l1 = " + l1);
        System.out.println("l2 = " + l2);
    }

    private static List<Integer> getAllMatches(@Nonnull final String s)
    {
        final Matcher m = P.matcher(s);
        final List<Integer> matches = new ArrayList<Integer>();
        while(m.find())
        {
            matches.add(Integer.valueOf(m.group(1)));
        }
        return matches;
    }
}

出力:

l1 = [1234, 12, 12, 12]
l2 = [1234, 12, 12, 12, 12]

GitHub で回答する

Stackoverflow GitHub リポジトリ

于 2014-09-23T22:45:00.150 に答える
0

これは、一部のみがオプションですが、その前後のスペースは必須であるため、最後のスペースが見つからない(\\d*)?場合は、最後に 2 つのスペースが必要になるためです。(\\d*)たぶん次のようなもので試してください

(\\d+?) <([A-Z]+?)> (:?(\\d+?) ){3,4}(</[A-Z]+?>)

ああ、終了タグが開始タグと同じであることを確認したい場合は\\1、最初のグループからの一致を表すなどのグループ参照を使用できます。したがって、正規表現を次のように更新してください

(\\d+?) <([A-Z]+?)> (:?(\\d+?) ){3,4}(</\\2>)
//        ^^^^^^^-----------------------^^^ 
//        group 2                       here value need to match one from group 2
于 2014-09-23T21:46:03.260 に答える
-1

「<」と「>」の間のラベルが一致する必要があり、その間の数字が同一であると仮定して、
このパターンを使用します

^\d+\s<([A-Z]+)>\s(\d+\s)(\2)+<\/(\1)>$  

デモ

または、中間の数字が同一である必要がなく、オプションである必要もない場合:

^\d+\s<([A-Z]+)>\s(\d+\s)*<\/(\1)>$
于 2014-09-23T21:56:25.783 に答える