66028


Javaで文字列を与えて「漢字かそれ以外か」でグルーピングしたいです．つまり、1文字とも取りこぼす文字はあってはならないのが条件です．次のようなサンプルを作ってみたのですが...

[code]

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class RegexTest {
    
        private static Pattern cjkIdeoGraphicOrNotPattern = Pattern.compile("(?U)([\\P{InCJKUnifiedIdeographs}]&&[\\P{InCJKUnifiedIdeographsExtensionA}]&&[\\P{InCJKUnifiedIdeographsExtensionB}]&&[\\P{InCJKUnifiedIdeographsExtensionC}]&&[\\P{InCJKUnifiedIdeographsExtensionD}])+|([\\p{InCJKUnifiedIdeographs}]|[\\p{InCJKUnifiedIdeographsExtensionA}]|[\\p{InCJKUnifiedIdeographsExtensionB}]|[\\p{InCJKUnifiedIdeographsExtensionC}]|[\\p{InCJKUnifiedIdeographsExtensionD}])+");
    
        public static void main(String[] args) {
            String target = "2000年问题 2001年问题";
            Matcher matcher = cjkIdeoGraphicOrNotPattern.matcher(target);
            while (matcher.find()) {
                System.out.println("Matches = \"" + matcher.group() + "\"");
            }
        }
    }
    
[/code]

結果は漢字の部分だけにマッチしてしまいます．

[code]

    Matches = "年问题"
    Matches = "年问题"
    
[/code]

望まれる結果は

[code]

    Matches = "2000"
    Matches = "年问题"
    Matches = " 2001"
    Matches = "年问题"
    
[/code]

なのですが、このようなことって正規表現で実現できますでしょうか？

以上 よろしくお願いいたします．


CC BY-SA 4.0
2020-04-27T07:08:33.643
66025
2020-04-27T08:26:24.617
9503
question
java 正規表現 unicode
文字列を漢字かそれ以外でグルーピングする


問題は、文字クラスの積の書き方の間違いです。`&&[` は `[ ]` の内側に書く必要があります。

[code]

      "(?U)([\\P{...}&&[\\P{...}]&&[\\P{...}]&&[\\P{...}]&&[\\P{...}]]+..."
    
[/code]

この場合は文字クラス積を使わなくてもいいかと思います。否定 `^` で十分です。

[code]

    private static String cjkIdeoGraphic =
        "\\p{In...}\\p{In...A}\\p{In...B}\\p{In...C}\\p{In...D}";
    private static Pattern cjkIdeoGraphicOrNotPattern = Pattern.compile(
        "(?U)([^" + cjkIdeoGraphic + "]+|[" + cjkIdeoGraphic + "]+)");
    
[/code]


CC BY-SA 4.0
2020-04-27T08:20:29.517
66028
2020-04-27T08:26:24.617
2020-04-27T08:26:24.617
3475
3475
66025
answer