正则表达式匹配Java中的混合RTL和LTR字符串

时间:2013-06-12 21:40:18

标签: java regex arabic right-to-left

我收到了阿拉伯语音译服务的JSON回复。

作为第一步,我尝试使用以下Pattern"\"r\":\"(\\P{M}\\p{M}*)*?\"");使用音译词语提取响应的一部分。当我输出整个选择时,这部分响应被正确返回:

"r":"تست\\\/0|طست\\\/1|تسة\\\/1|طسة\\\/1|تيست\\\/1|طاسة\\\/1|تيسة\\\/1|تصت\\\/2|تثت\\\/2|تسط\\\/2"

但是,当我尝试仅使用m.group(1)获取组部分时,输出为2。我期待"r":""之间的所有单词部分。

当我尝试在Eclipse中选择整个控制台输出时,"r":似乎是LTR,其余的是RTL。也许这打破了正则表达式。

如何在"r":""之间获得整个群组?

1 个答案:

答案 0 :(得分:4)

你正在重复这个小组。你的基本结构就像

(matchCharacter)*?

因此,组1仅捕获一个字符而不是整个字符串。每次再次使用该组时,将覆盖先前的捕获。这就是为什么你得到最后一个字符(由于RTL写法,这是最左边的字符)。

只是,将整个重复包装在一个组中,并使重复的部分不被捕获:

"\"r\":\"((?:\\P{M}\\p{M}*)*?)\""

无论RTL还是LTR写入,这都适用。只有,如果你使用的是最初的模式,你将获得最左边或最右边的字符,具体取决于方向(因为它将是内存中的最后一个字符)。