对非阿拉伯字符进行拆分

2022-09-03 17:44:42

我有一个这样的字符串

أصبح::ينال::أخذ::حصل (على)::أحضر

我想使用java将其拆分为非阿拉伯字符

这是我的代码

String s = "أصبح::ينال::أخذ::حصل (على)::أحضر";
String[] arr = s.split("^\\p{InArabic}+");
System.out.println(Arrays.toString(arr));

输出是

[, ::ينال::أخذ::حصل (على)::أحضر]

但我预计输出是

[ينال,أخذ,حصل,على,أحضر]

所以我不知道这有什么问题?


答案 1

您需要一个否定的类,为此,您需要 方括号 。尝试用这个来拆分:[ ... ]

"[^\\p{InArabic}]+"

如果匹配任何阿拉伯字符,则将匹配任何非阿拉伯字符。\\p{InArabic}[^\\p{InArabic}]


您可以考虑的另一个选项是等效的语法,而不是像@Pshemo提到的那样指示字符类的相反:Pp\\p{InArabic}

"\\P{InArabic}+"

这就像是 相反的。\\W\\w

与第二种语法相比,第一种语法的唯一可能优势(再次如@Pshemo提到的),是,如果要将其他字符添加到不应匹配的字符列表中,例如,如果要匹配所有非例外句点,则第一个语法更灵活:\\p{InArabic}

"[^\\p{InArabic}.]+"
                ^

否则,如果你真的想使用 ,你需要在类中减法\\P{InArabic}

"[\\P{InArabic}&&[^.]]+"

答案 2

您想要的表达式是"\\P{InArabic}+"

这意味着匹配任何(非零)非阿拉伯语字符数。