На основании
Я пытаюсь сопоставить определенный шаблон в моем тексте:
Арабский текст) Арабский текст (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