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

4

我从一个阿拉伯语音译服务中接收到了一个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个回答

4
你正在重复组。你的基本结构如下:
(matchCharacter)*?

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

只需将整个重复部分放在一组中,并使重复部分不捕获:

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

无论是从右到左的写作方式还是从左到右的写作方式,这都适用。只是,如果您使用原始的模式,将会得到最左边或最右边的字符,具体取决于方向(因为它将是内存中的最后一个字符)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接