在Java中匹配阿拉伯标点符号

时间:2018-10-18 03:27:27

标签: java regex arabic

我想用这段代码在REGEX_PATTERN2上进行编辑,以使用阿拉伯标点符号的matchs()方法

 String REGEX_PATTERN = "[\\.|,|:|;|!|_|\\?]+";
        String s1 = "My life :is happy, stable";
        String[] result = s1.split(REGEX_PATTERN);
        for (String myString : result) {
            System.out.println(myString);   

}

         String REGEX_PATTERN2 = "[\\.|,|:|;|!|_|،|؛|؟\\?]+";
            String s2 = " حياتي ؛ سعيدة، مستقر";
            String[] result2 = s2.split(REGEX_PATTERN2);
            for (String myString : result2) {
                System.out.println(myString);   

    }

我想要的输出

我的生活

很开心

稳定

حياتي

سعيدة

مستقر

如何编辑此代码并使用 matches()而不是 split()方法来获得带有阿拉伯标点符号的相同输出

3 个答案:

答案 0 :(得分:3)

这里有一些问题。首先是这个例子:

  if (word.matches("[\\.|,|:|;|!|\\?]+"))

由于以下原因,这 1 有点不正确:

  1. .不需要在字符类中转义。
  2. |并不意味着字符类中的替换。
  3. ?不需要在字符类中转义。

(有关更多详细信息,请阅读javadoc或有关Java正则表达式的教程。)

因此您可以将以上内容重写为:

  if (word.matches("[.,:;!?]+"))

...假设您不想将管道字符归类为标点符号。

现在,这个:

 if (word.matches("[\.|,|:|;|!|،|؛|..|...|؟|\?]+")) 

您遇到与上述相同的问题。另外,您似乎已经使用了两个和三个句号/句点字符,而不是(大概)一些Unicode字符。我怀疑它们可能是\ufbb7u061e\u06db,但我不是语言学家。 (肯定有2或3个完全停止是错误的。)


那么阿拉伯语的标点符号是什么?

说实话,我认为答案取决于您所看的来源,但是维基百科states

  

在常规阿拉伯文字键入中仅使用阿拉伯问号⟨?⟩和阿拉伯逗号and,并且通常用逗号代替拉丁字母逗号(,)。


1-轻微错误,是指此示例中的错误大部分无害。但是,在类中包含|字符(的多个实例)的确表示您会错误地将“管道”归类为标点符号。

答案 1 :(得分:0)

[]表示正则表达式字符类,这意味着它仅匹配单个字符。 ...是3个字符,因此不能在字符类中使用。

在字符类中,您不必使用|分隔字符,也不需要转义.?

您可能是故意的,这是其他字符序列的列表:

"(?:\\.|,|:|;|!|\\?|،|؛|؟|\\.\\.|\\.\\.\\.)+"

如果使用字符类,则可能会获得更好的性能:

"(?:\\.{1,3}|[,:;!?،؛؟])+"

当然,以+结尾,在每次迭代中匹配1-3个周期是相当多余的,因此可以这样做:

"[.,:;!?،؛؟]+"

答案 2 :(得分:0)

这是一种不同的方法,它使用Unicode属性而不是特定的字符(以防您关心的阿拉伯符号不仅仅是另一个答案中提到的问号和逗号):

"(?=^[\\p{InArabic}.,:;!?]+$)^\\p{IsPunctuation}+$"

它匹配具有标点符号类别的整个字符串,这些字符串也位于阿拉伯语块中,或者是您在工作中列出的其他标点符号之一。

它将匹配诸如"؟،""؟،:"之类的字符串,但不匹配"؟،ؠ""؟،a"之类的字符串。

相关问题