为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2021-11-24 16:00:51
我想在此代码中编辑 REGEX_PATTERN2 以使用阿拉伯标点符号的匹配()方法 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 回答

?
翻阅古今

TA贡献1780条经验 获得超5个赞

这里有几个问题。首先这个例子:

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

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

  1. A.不需要在字符类中转义。

  2. A|并不意味着字符类中的交替。

  3. A?不需要在字符类中转义。

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

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

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

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

现在这个:

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

你有和上面一样的问题。此外,您似乎使用了两个和三个句号/句点字符而不是(大概)某些 Unicode 字符。我怀疑它们可能是 a \ufbb7or u061eor \u06db,但我不是语言学家。(当然 2 或 3 个句号是不正确的。)


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

老实说,我认为答案取决于您查看的来源,但维基百科指出

只有阿拉伯语问号 ⟨؟⟩ 和阿拉伯语逗号 ⟨،⟩ 用于常规阿拉伯语文字输入,并且逗号经常被拉丁文字逗号 (,) 替代。


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


查看完整回答
反对 回复 2021-11-24
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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

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

你可能是这个意思,它是一个替代字符序列的列表:

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

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

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

当然,+在最后,每次迭代匹配 1-3 个周期是相当多余的,所以这样做:

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


查看完整回答
反对 回复 2021-11-24
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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

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

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

它会匹配像"؟،"or 之类的字符串"؟،:",但不会匹配"؟،ؠ"or "؟،a"


查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 218 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信