我想用这段代码在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()方法来获得带有阿拉伯标点符号的相同输出
答案 0 :(得分:3)
这里有一些问题。首先是这个例子:
if (word.matches("[\\.|,|:|;|!|\\?]+"))
由于以下原因,这 1 有点不正确:
.
不需要在字符类中转义。|
并不意味着字符类中的替换。?
不需要在字符类中转义。(有关更多详细信息,请阅读javadoc或有关Java正则表达式的教程。)
因此您可以将以上内容重写为:
if (word.matches("[.,:;!?]+"))
...假设您不想将管道字符归类为标点符号。
现在,这个:
if (word.matches("[\.|,|:|;|!|،|؛|..|...|؟|\?]+"))
您遇到与上述相同的问题。另外,您似乎已经使用了两个和三个句号/句点字符,而不是(大概)一些Unicode字符。我怀疑它们可能是\ufbb7
或u061e
或\u06db
,但我不是语言学家。 (肯定有2或3个完全停止是错误的。)
那么阿拉伯语的标点符号是什么?
说实话,我认为答案取决于您所看的来源,但是维基百科states:
在常规阿拉伯文字键入中仅使用阿拉伯问号⟨?⟩和阿拉伯逗号and,并且通常用逗号代替拉丁字母逗号(,)。
1-轻微错误,是指此示例中的错误大部分无害。但是,在类中包含|
字符(的多个实例)的确表示您会错误地将“管道”归类为标点符号。
答案 1 :(得分:0)
[]
表示正则表达式字符类,这意味着它仅匹配单个字符。 ...
是3个字符,因此不能在字符类中使用。
在字符类中,您不必使用|
分隔字符,也不需要转义.
和?
。
您可能是故意的,这是其他字符序列的列表:
"(?:\\.|,|:|;|!|\\?|،|؛|؟|\\.\\.|\\.\\.\\.)+"
如果使用字符类,则可能会获得更好的性能:
"(?:\\.{1,3}|[,:;!?،؛؟])+"
当然,以+
结尾,在每次迭代中匹配1-3个周期是相当多余的,因此可以这样做:
"[.,:;!?،؛؟]+"
答案 2 :(得分:0)
这是一种不同的方法,它使用Unicode属性而不是特定的字符(以防您关心的阿拉伯符号不仅仅是另一个答案中提到的问号和逗号):
"(?=^[\\p{InArabic}.,:;!?]+$)^\\p{IsPunctuation}+$"
它匹配具有标点符号类别的整个字符串,这些字符串也位于阿拉伯语块中,或者是您在工作中列出的其他标点符号之一。
它将匹配诸如"؟،"
或"؟،:"
之类的字符串,但不匹配"؟،ؠ"
或"؟،a"
之类的字符串。