Regex match обратная скобка в арабском тексте - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь сопоставить определенный шаблон в моем тексте, который выглядит так:

Arabic text ) Arabic Text ( Arabic Text

И я пытаюсь перевернуть скобки, чтобы получить это:

Arabic text ( Arabic Text ) Arabic Text

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

) Arabic Text (
private static final Pattern Pat = Pattern.compile("(\\)\\p{InARABIC}*\\()", Pattern.CASE_INSENSITIVE);

public String replace(String text) {
        Matcher m = Pat.matcher(text);
        while (m.find()) {
            text = m.group(1);
               ++some operations on the extracted text++
             }
}

Я не получаю соответствия ни одному из этих примеров:

)أ(
)السلام(
هذا مجرد ) مثال ( .. طبعا

Я ожидаю это в качестве вывода:

)أ(
)السلام(
) مثال (

Есть мысли?

1 Ответ

3 голосов
/ 15 апреля 2019

На основании

Я пытаюсь сопоставить определенный шаблон в моем тексте:
Арабский текст) Арабский текст (Arabic Text
и я пытаюсь перевернуть скобки, чтобы получить:
Арабский текст (Arabic Text) Арабский текст

Кажется, проблема в том, что ваше регулярное выражение принимает только один арабский символ и не принимает пробелы.

Так что вместо \\p{InARABIC} вам понадобится что-то вроде [\\p{InARABIC}\\s]+ до

  • \s разрешить совпадение пробелов
  • + соответствует одному или нескольким символам.

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

Демо-версия:

String data = ")أ(\n" +
        ")السلام(\n" +
        "هذا مجرد ) مثال ( .. طبعا";

Pattern Pat = Pattern.compile("\\)([\\p{InARABIC}\\s]+)\\(", Pattern.CASE_INSENSITIVE);
Matcher m = Pat.matcher(data);
String replacement = m.replaceAll(match -> "(" + match.group(1) + ")");
System.out.println(data);
System.out.println("-----------");
System.out.println(replacement);

Выход:

)أ(
)السلام(
هذا مجرد ) مثال ( .. طبعا
-----------
(أ)
(السلام)
هذا مجرد ( مثال ) .. طبعا

НО, если ваша цель - поменять местами ( и ) независимо от их положения , тогда вы можете использовать

Pat = Pattern.compile("\\(|\\)");
replaced = Pat.matcher(data).replaceAll(match -> {
    if (match.group().equals(")"))
        return "(";
    else
        return ")";
});
System.out.println(replaced);

Выход:

(أ)
(السلام)
هذا مجرد ( مثال ) .. طبعا

Чтобы не заменять (..)..(..) на (..(..)..), вы можете сначала позволить регулярному выражению совпадать (..), чтобы ) не был частью )..( совпадения.

Упрощенная демонстрация:

String data = "aa(bb)cc(dd)ee)ff(gg";

Pattern p = Pattern.compile("\\(\\w+\\)|\\)(\\w+)\\(", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(data);
String replacement = m.replaceAll(match -> {
    if (match.group(1) == null) {
        return match.group();
    } else {
        return "(" + match.group(1) + ")";
    }
});
System.out.println(data);
System.out.println("-----------");
System.out.println(replacement);

Выход:

aa(bb)cc(dd)ee)ff(gg
-----------
aa(bb)cc(dd)ee(ff)gg
...