Javaのスキャナでの非キャプチャグループは無視されます

AgentM:

私はスキャナをエスケープする場合を除いて(またはラインの開始時に)、すべての@記号で文字列を分割取得しようとしています

私の正規表現: (?:[^\\])@

(?:            // Start of non-capturing group (0)
  [            // Match any characters in square brackets [
    ^\\        // Match any non-\ character.
  ]            // ]
)              // End of non-capturing group (0)
@              // Match literal '@'

私の理解から、これは私の意図のために働く必要があります。

スキャナでこのパターンを使用する場合しかし、それは単に「だけであるべきである(AT /分割が削除された部分)は、非捕捉基は単に区切り、照合するために、区切り文字に向かってカウントされるべきではないという事実を無視します@ 」。したがって、次の例の文字列のために:「Hello Worldの@」、結果は[「こんにちは」、「世界」]でなければならないであろう。

コードサンプルの下に実行している場合を除き:

private static void test() {
    try (Scanner sc = new Scanner("test@here")) {
        sc.useDelimiter("(?:[^\\\\])@"); // Every unescaped @ sign.
        while (sc.hasNext()) {
            String token = sc.next();
            System.out.println(token);
        }
    }   
}

利回り:

tes
here

代わりに、期待の:

test
here
kshetline:

デリミタは、捕捉又は捕捉しない、グループに任意関係なく全体の一致であると考えられます。

何が必要後読みパターンであり、構文は、負の後読みとここに簡単です。

sc.useDelimiter("(?<!\\\\)@");

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313870&siteId=1