与 RTL 语言一起使用时字符串替换函数调用的顺序

Order of string replacement function invocations when used with RTL languages

使用替换函数调用String.replace时,我们能够检索匹配子字符串的偏移量。

var a = [];
"hello world".replace(/l/g, function (m, i) { a.push(i); });
// a = [2, 3, 9]

在上面的示例中,我们获取了匹配 l 个字符的偏移量列表。

我能否指望实现始终按出现的升序调用匹配函数,即使使用从右到左书写的语言

也就是说:我能确定上面的结果总是 [2,3,9] 而不是 [3,9,2] 或这些偏移量的任何其他排列吗?

这是对 that Tomalak 的后续回答:

Absolutely, yes. Matches are handled from left to right in the source string because left-to-right is how regular expression engines work their way to a string.

然而,关于 RTL 语言的情况,他还说:

That's a good question [...] RTL text definitely changes how JavaScript regular expressions behave.

我在 Chrome 中使用以下 RTL 片段进行了测试:

var a = [];
"بلوچی مکرانی".replace(/ی/g, function (m, i) { a.push(i); });
// a = [4, 11]

我不会说那种语言,但在查看字符串时,我看到 ی 字符是字符串的第一个字符,也是白色 space 之后的第一个字符。但是,由于文本是从右到左书写的,因此这些位置实际上是 白色 之前的最后一个字符 space 和 字符串中的最后一个字符 - 转换为 [4,11]

因此,这似乎与 Chrome 中的预期一样有效。问题是:我能相信所有符合要求的 javascript 实现的结果都是一样的吗?

ECMA-262 5.1 Edition/June 2011 我用"format control", "right to left" 和 "RTL" 关键字搜索过,没有提到它们,除了它说字符串文字和正则表达式文字中允许使用格式控制字符。

来自第 7.1 节

It is useful to allow format-control characters in source text to facilitate editing and display. All format control characters may be used within comments, and within string literals and regular expression literals.

附件 E

7.1: Unicode format control characters are no longer stripped from ECMAScript source text before processing. In Edition 5, if such a character appears in a StringLiteral or RegularExpressionLiteral the character will be incorporated into the literal where in Edition 3 the character would not be incorporated into the literal

据此,我得出结论 JavaScript 对从右到左的字符的操作没有任何不同。它只知道存储在字符串中的 UTF-16 代码单元,并基于 logical order.

工作