0

Javaを使用して正規表現と比較しながら、一致しないデータを削除しようとしています。そして私の要求はこのようなものです。私の正規表現は次のとおりです。

([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})

次のような文字列を受け入れる必要があります。

SHIVA1234AXM123_PRA_123

しかし、この場合、私が何かaaSHIVA1234AXM123_PRA_123aa(または)SHIVA1234AXccccM123_PRA_123のように与えると、このメソッドはこのようにaaaa(または)与える必要がありccccます。次のコードを試しました:

public class ExpressionDemo {
    public static void main(String[] args) {
        String regex = "([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})";
        Pattern p = Pattern.compile(regex);

        String str="SHIVA1234AXM123_PRA_123";
        Matcher m = p.matcher(str);  
        System.out.println(m.groupCount());

        for(int i=1;i<=m.groupCount();i++)
        {
            int start=0;
            int end=0;
            System.out.println("count "+i);
            if(m.lookingAt())
            {
                System.out.println(m.group(i));
                System.out.println("start of group"+m.start(i));
                System.out.println("end of group"+m.end(i));
                start=m.start(i);
                end=m.end(i);
                m.reset();
            }
            else
            {
                System.out.println("ELSE");
                System.out.println(start);
                System.out.println(end);
            }
        }
    }
}

これは正の場合ですが、偽の場合にはこれが必要です。そして、それはどの式でも一般的でなければなりません--->文字列。

4

2 に答える 2

1

したがって、「負のケース」では、別の文字列によって「中断」される可能性のある連続した文字列 (文字間に空白がない) があり、その「割り込み」文字列と一致させたいと思いますか?

これを達成するために私が考えることができる唯一の方法は、各「有効な」文字の間の連続する非空白文字をすべてキャプチャすることです。これは非常に醜いものになるでしょう:

(\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)[A-Z](\S*?)(?:X|E)(\S*?)(?:M|D)(\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*?)_(\S*?)P(\S*?)R(\S*?)A(\S*?)_(\S*?)[0-9](\S*?)[0-9](\S*?)[0-9](\S*)
^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^       ^^^^^^       ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^

正しく数えると、ここには 24 のキャプチャ グループがあります。それらをすべて連結してください!

編集

ちなみに、いくつかの文字を保存する\d代わりに使用できます。[0-9]

(\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)[A-Z](\S*?)\d(\S*?)\d(\S*?)\d(\S*?)\d(\S*?)[A-Z](\S*?)(?:X|E)(\S*?)(?:M|D)(\S*?)\d(\S*?)\d(\S*?)\d(\S*?)_(\S*?)P(\S*?)R(\S*?)A(\S*?)_(\S*?)\d(\S*?)\d(\S*?)\d(\S*)
^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^     ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^     ^^^^^^       ^^^^^^       ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^  ^^^^^^  ^^^^^^  ^^^^^
于 2012-11-02T07:42:44.543 に答える
0

if (m.matches())または - その他の場合 -を使用する必要がありますwhile (m.find())

たとえば、前に追加される可能性のあるものを確認するには、その場所に追加し(.*)ます。

//              1   2                      3
String regex = "(.*)([A-Z]{5}[0-9]{4}[A-Z])(XM|XD|EM|ED)([0-9]{3})(_PRA_)([0-9]{3})";


Matcher m = p.matcher(str);
if (m.matches()) {
    System.out.println("Extra in front: '" + m.group(1) + "'");
}
于 2012-11-02T07:32:30.183 に答える