正则表达式匹配反向阿拉伯语括号

时间:2019-04-15 12:37:30

标签: java arabic arabic-support

我正在尝试匹配文本中的特定模式,即:

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 个答案:

答案 0 :(得分:3)

基于

  

我正在尝试匹配文本中的特定模式:
  阿拉伯文字)阿拉伯文字(阿拉伯文字
  我正试图将括号反转成
  阿拉伯文字(阿拉伯文字)阿拉伯文字

问题似乎在于您的正则表达式仅接受阿拉伯字符,而不接受空格。

因此,您需要\\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