3 回答
TA贡献1780条经验 获得超5个赞
这里有几个问题。首先这个例子:
if (word.matches("[\\.|,|:|;|!|\\?]+"))
由于以下原因,这有点1不正确:
A
.
不需要在字符类中转义。A
|
并不意味着字符类中的交替。A
?
不需要在字符类中转义。
(有关更多详细信息,请阅读javadoc或有关 Java 正则表达式的教程。)
因此,您可以将上述内容重写为:
if (word.matches("[.,:;!?]+"))
...假设您不想将管道字符归类为标点符号。
现在这个:
if (word.matches("[\.|,|:|;|!|،|؛|..|...|؟|\?]+"))
你有和上面一样的问题。此外,您似乎使用了两个和三个句号/句点字符而不是(大概)某些 Unicode 字符。我怀疑它们可能是 a \ufbb7
or u061e
or \u06db
,但我不是语言学家。(当然 2 或 3 个句号是不正确的。)
那么阿拉伯语中的标点符号是什么?
老实说,我认为答案取决于您查看的来源,但维基百科指出:
只有阿拉伯语问号 ⟨؟⟩ 和阿拉伯语逗号 ⟨،⟩ 用于常规阿拉伯语文字输入,并且逗号经常被拉丁文字逗号 (,) 替代。
1 - 稍微不正确,我的意思是这个例子中的错误大多是无害的。但是,您|
在类中包含(多个实例)字符 n 确实意味着您会将“管道”错误地归类为标点符号。
TA贡献1801条经验 获得超16个赞
[]
表示正则表达式字符类,这意味着它只匹配单个字符。...
是 3 个字符,因此不能在字符类中使用。
在字符类中,您不需要用 分隔字符|
,也不需要转义.
和?
。
你可能是这个意思,它是一个替代字符序列的列表:
"(?:\\.|,|:|;|!|\\?|،|؛|؟|\\.\\.|\\.\\.\\.)+"
如果您确实使用字符类,您可能会获得更好的性能:
"(?:\\.{1,3}|[,:;!?،؛؟])+"
当然,+
在最后,每次迭代匹配 1-3 个周期是相当多余的,所以这样做:
"[.,:;!?،؛؟]+"
TA贡献1772条经验 获得超6个赞
这是一种不同的方法,它使用 Unicode 属性而不是特定字符(如果您关心更多的阿拉伯语标记,而不仅仅是另一个答案中提到的问号和逗号):
"(?=^[\\p{InArabic}.,:;!?]+$)^\\p{IsPunctuation}+$"
它匹配具有标点符号类别的整个字符串,这些字符串也位于阿拉伯语块中,或者是您在努力中列出的其他标点符号之一。
它会匹配像"؟،"
or 之类的字符串"؟،:"
,但不会匹配"؟،ؠ"
or "؟،a"
。
添加回答
举报