我正在尝试匹配文本中的特定模式,即:
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++
}
}
这些示例中的任何一个都没有匹配项:
)أ(
)السلام(
هذا مجرد ) مثال ( .. طبعا
我希望这是一个输出:
)أ(
)السلام(
) مثال (
有什么想法吗?
答案 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