Соответствие арабским знакам препинания на Java - PullRequest
0 голосов
/ 18 октября 2018

Я хочу отредактировать REGEX_PATTERN2 в этом коде для работы с методом match () арабских знаков препинания

 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);   

    }

Вывод, который я хотел

Моя жизнь

счастлив

стабильный

حياتي

سعيدة

مستقر

Как я могу редактировать этот код и использовать match () вместо метод split () , чтобы получить тот же вывод с арабскими знаками препинания

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Здесь есть несколько проблем.Сначала этот пример:

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

Это слегка 1 неверно по следующей причине:

  1. A . не нужно экранировать вкласс символов.
  2. A | не означает чередование в классе символов.
  3. A ? не требуется экранировать в классе символов.

(Для получения более подробной информации прочитайте javadoc или учебник по регулярным выражениям Java.)

Таким образом, вы можете переписать вышеприведенное как:

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

...Предполагая, что вы не хотите классифицировать символ канала как пунктуацию.

Теперь это:

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

У вас те же проблемы, что и выше.Кроме того, вы, кажется, использовали два и три символа полной остановки / точки вместо (предположительно) какого-либо символа Юникода.Я подозреваю, что они могут быть \ufbb7 или u061e или \u06db, но я не лингвист.(Конечно, 2 или 3 точки остановки неправильны.)


Так что же являются знаками препинания на арабском языке?

Если честно, я думаю, что ответ зависит от того, на какой источник вы смотрите, но Википедия сообщает :

Только арабский вопросительный знак ⟨؟⟩и арабская запятая ⟨،⟩ используется при обычном наборе текста на арабском языке, и запятая часто заменяется латинской запятой (,).


1 - Я имею в виду, что ошибки в этом примере в основном безвредны.Тем не менее, включение вами (10 раз) символа | в класс означает, что вы неправильно классифицируете "трубу" как пунктуацию.

0 голосов
/ 18 октября 2018

Вот другой подход, который использует свойства Unicode вместо определенных символов (Если вам нужно больше арабских знаков, чем просто вопросительный знак и запятая, упомянутые в другом ответе):

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

Это соответствуетцелая строка символов, имеющих категорию пунктуации, которые также находятся в арабском блоке или являются одним из других символов пунктуации, перечисленных вами в ваших усилиях.

Он будет соответствовать строкам, таким как "؟،" или "؟،:", но не "؟،ؠ" или "؟،a".

0 голосов
/ 18 октября 2018

[] обозначает регулярное выражение класс символов , что означает, что он соответствует только одиночным символам.... - это 3 символа, поэтому его нельзя использовать в классе символов.

В классе символов вы не разделяете символы с помощью |, и вам не нужно экранировать .и ?.

Вы, вероятно, имели в виду это, то есть список альтернативных последовательностей символов:

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

Вы могли бы получить лучшую производительность, если бы вы использоваликласс символов, где вы можете:

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

Конечно, с + в конце, совпадение 1-3 периодов в каждой итерации довольно избыточно, так что это будет делать:

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

...