1

PatternとMatcherを使用して、次の文字列を複数の変数として返したいと思います。

    ArrayList <Pattern> pArray = new ArrayList <Pattern>();
    pArray.add(Pattern.compile("\\[[0-9]{2}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}\\]"));
    pArray.add(Pattern.compile("\\[\\d{1,5}\\]"));
    pArray.add(Pattern.compile("\\[[a-zA-Z[^#0-9]]+\\]"));
    pArray.add(Pattern.compile("\\[#.+\\]"));
    pArray.add(Pattern.compile("\\[[0-9]{10}\\]"));
    Matcher iMatcher;
    String infoString = "[03/12/13 10:00][30][John Smith][5554215445][#Comment]";
    for (int i = 0 ; i < pArray.size() ; i++)
    {
        //out.println(pArray.get(i).toString());
        iMatcher = pArray.get(i).matcher(infoString);

        while (dateMatcher.find())
        {
                String found = iMatcher.group();
                out.println(found.substring(1, found.length()-1));
        }
    }
}

プログラムの出力:

[03/12/13 10:00]

[30]

[John Smith]

[\#Comment]

[5554215445]

必要なのは、プログラムで角かっこと#文字を出力しないようにすることだけです。ループ内の部分文字列を使用して角かっこを印刷することは簡単に回避できますが、#文字を回避することはできません。#は文字列内のコメント識別子にすぎません。

これはループ内で実行できますか?

4

2 に答える 2

2

先読みを使用します。つまり、すべての\\[(正規表現内の)変更を前向きな後読みで変更します。

(?<=\\[)

次に、\\](正規表現内の)すべてを前向きに変更します。

(?=\\])

最後\\[#に、(正規表現で)前向きな後読みで変更します。

(?<=\\[#)
于 2013-03-13T10:43:57.777 に答える
2

これはどう?

public static void main(String[] args) {
    String infoString = "[03/12/13 10:00][30][John Smith][5554215445][#Comment]";
    final Pattern pattern = Pattern.compile("\\[#?(.+?)\\]");
    final Matcher matcher = pattern.matcher(infoString);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }
}

欲張りでないものを作成するだけで.+、角かっこ内のすべてに一致します。次に、一致したパターン全体を使用するのではなく、一致グループを使用して必要なものを取得します。一致グループはで表され(pattern)ます。#?グループに入らないように、一致グループの前にハッシュを一致させます。

一致グループは、を使用して取得されmatcher.group(1)ます。

出力:

03/12/13 10:00
30
John Smith
5554215445
Comment
于 2013-03-13T10:42:28.580 に答える