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"
。
添加回答
舉報