Разделить на неарабские символы

У меня есть строка, подобная этой

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

И я хочу разбить его на арабские символы, используя java

И вот мой код

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

И результат был

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

Но я ожидаю, что вывод будет

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

Так что я не знаю, что с этим случилось?

Ответы

Ответ 1

Вам нужен класс с отрицанием, и для этого вам нужны квадратные скобки [ ... ]. Попробуйте разделить с этим:

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

Если \\p{InArabic} соответствует любому арабскому символу, то [^\\p{InArabic}] будет соответствовать любому неарабскому символу.


Другим вариантом, который вы можете рассмотреть, является эквивалентный синтаксис, используя P вместо P, чтобы указать противоположность класса символов \\p{InArabic}, например, @Pshemo:

"\\P{InArabic}+"

Это работает так же, как \\W является противоположностью \\W.

Единственное возможное преимущество, которое вы получаете с первым синтаксисом над вторым (опять же, как и упоминавшееся @Pshemo), состоит в том, что если вы хотите добавить других символов в список символов, которые не должны совпадать, например, если вы хотите для соответствия всем не \\p{InArabic} за исключением периодов, первый из них более гибкий:

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

В противном случае, если вы действительно хотите использовать \\p{InArabic}, вам понадобится вычитание внутри классов:

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

Ответ 2

Выражение, которое вы хотите, "\\P{InArabic}+"

Это означает соответствие любому (отличному от нуля) числу символов, которые не являются арабскими.