非阿拉伯字符分割

14

我有一个像这样的字符串

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

我希望你能用Java将文本按非阿拉伯字符进行拆分。

这是我的代码:

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

输出结果为

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

但我希望输出的结果是

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

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


你不能用 "" 替换所有的 :: 吗? - eatSleepCode
2
你需要在 [^\\p{InArabic}]+ 上进行分割 - 你忘记了字符类。在 [] 外面,^ 是一个行起始锚点。 - Boris the Spider
2个回答

17
你需要一个取反的类,为此,你需要使用方括号[ ... ]。尝试用这个进行分割:

You need a negated class, and to do that, you need square brackets [ ... ]. Try to split with this:

"[^\\p{InArabic}]+"
如果\\p{InArabic}匹配任何阿拉伯字符,则[^\\p{InArabic}]将匹配任何非阿拉伯字符。
另一个选择是使用等效语法,使用P而不是p来表示\\p{InArabic}字符类的相反部分,就像@Pshemo提到的那样:
"\\P{InArabic}+"

这个和\\w相反,就像\\W一样。

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

"[^\\p{InArabic}.]+"
                ^
否则,如果你真的想使用\\P{InArabic},你需要在类中使用减法
"[\\P{InArabic}&&[^.]]+"

@MarounMaroun 我不这么认为 - 这是一个否定的字符类。 - Boris the Spider
@BoristheSpider 确实。我错过了 ^ - Maroun
8
如果我没记错的话,\P{xxx}\p{xxx} 的否定形式,因此不需要使用 [^\p{xxx}](除非您想将更多的 \p{xyz} 类添加到 [...] 中)。 - Pshemo

16

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接