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

在Java中匹配阿拉伯语标点符号,java,regex,arabic,Java,Regex,Arabic,我想在此代码中编辑REGEX_PATTERN2,以使用阿拉伯语标点符号的matches()方法 String REGEX_PATTERN = "[\\.|,|:|;|!|_|\\?]+"; String s1 = "My life :is happy, stable"; String[] result = s1.split(REGEX_PATTERN); for (String myString : result) { S

我想在此代码中编辑REGEX_PATTERN2,以使用阿拉伯语标点符号的matches()方法

 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个字符,因此不能在字符类中使用

在字符类中,不需要用
|
分隔字符,也不需要转义

您的意思可能是,这是一个备用字符序列列表:

“(?:\\.\124;,:\\.\ 124;!\ 1248;\1248;\1246;\1246;\124\.\ 124\.\ 124\.\)+”

如果使用可以执行以下操作的角色类,您可能会获得更好的性能:

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

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


“[,:;!?،؟]+”
[]
表示正则表达式字符类,这意味着它只匹配单个字符<代码>为3个字符,因此不能在字符类中使用

在字符类中,不需要用
|
分隔字符,也不需要转义

您的意思可能是,这是一个备用字符序列列表:

“(?:\\.\124;,:\\.\ 124;!\ 1248;\1248;\1246;\1246;\124\.\ 124\.\ 124\.\)+”

如果使用可以执行以下操作的角色类,您可能会获得更好的性能:

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

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


“[,:;!?،œ؟]+”

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

  if (word.matches("[\\.|,|:|;|!|\\?]+"))
由于以下原因,这有点不正确:

  • 不需要在字符类中转义
  • |
    并不意味着字符类中的交替
  • 不需要在字符类中转义
  • (有关更多详细信息,请阅读或有关Java正则表达式的教程。)

    因此,您可以将上述内容改写为:

      if (word.matches("[.,:;!?]+"))
    
    。。。假设您不想将管道字符分类为标点符号

    现在:

     if (word.matches("[\.|,|:|;|!|،|؛|..|...|؟|\?]+")) 
    
    你有和上面一样的问题。此外,您似乎使用了两个和三个句号/句点字符,而不是(大概)某些Unicode字符。我怀疑他们可能是
    \ufbb7
    u061e
    \u06db
    ,但我不是语言学家。(当然,2或3个句号是不正确的。)


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

    老实说,我认为答案取决于你看的是什么来源,但维基百科:

    只有阿拉伯问号⟨؟⟩ 还有阿拉伯逗号⟨،⟩ 常用于常规的阿拉伯文打字,逗号通常代替拉丁语的逗号(,)



    1-我的意思是,这个例子中的错误大多是无害的。但是,在类中包含
    |
    字符(多个实例)确实意味着您将错误地将“管道”分类为标点符号

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

      if (word.matches("[\\.|,|:|;|!|\\?]+"))
    
    由于以下原因,这有点不正确:

  • 不需要在字符类中转义
  • |
    并不意味着字符类中的交替
  • 不需要在字符类中转义
  • (有关更多详细信息,请阅读或有关Java正则表达式的教程。)

    因此,您可以将上述内容改写为:

      if (word.matches("[.,:;!?]+"))
    
    。。。假设您不想将管道字符分类为标点符号

    现在:

     if (word.matches("[\.|,|:|;|!|،|؛|..|...|؟|\?]+")) 
    
    你有和上面一样的问题。此外,您似乎使用了两个和三个句号/句点字符,而不是(大概)某些Unicode字符。我怀疑他们可能是
    \ufbb7
    u061e
    \u06db
    ,但我不是语言学家。(当然,2或3个句号是不正确的。)


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

    老实说,我认为答案取决于你看的是什么来源,但维基百科:

    只有阿拉伯问号⟨؟⟩ 还有阿拉伯逗号⟨،⟩ 常用于常规的阿拉伯文打字,逗号通常代替拉丁语的逗号(,)



    1-我的意思是,这个例子中的错误大多是无害的。但是,在类中包含
    |
    字符(多个实例)确实意味着您将错误地将“管道”分类为标点符号

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

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


    它将匹配字符串,如
    “؟1548;”
    ”:“
    ,但不匹配
    “ؠ1568;”
    “،a”

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

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

    它将匹配字符串,如
    “؟”<