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

时间:2015-01-12 15:27:10

标签: javascript regex right-to-left

使用替换功能调用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]或其他任何偏移的排列吗?

这是对this question回复的Tomalak的跟进:

  

当然,是的。匹配在源字符串中从左到右处理,因为从左到右是正则表达式引擎以字符串形式工作的方式。

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

  

这是一个很好的问题[...] RTL文本肯定会改变JavaScript正则表达式的行为方式。

我已使用Chrome中的以下RTL代码段进行了测试:

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

我不会说那种语言,但是看着字符串,我看到ی字符是字符串的第一个字符,并且是白色空格后面的第一个字符。但是,由于文本是从右向左书写的,因此这些位置实际上是空格前的最后一个字符 中的最后一个字符 - 这些字符转换为{{ 1}}

所以,这似乎与Chrome中的预期效果相同。问题是:我是否可以相信所有合规的javascript实施结果都相同?

1 个答案:

答案 0 :(得分:2)

我在ECMA-262 5.1版/ 2011年6月搜索了关键字"格式控制","从右到左"和" RTL",并没有提及它们,除了在字符串文字和正则表达式文字中允许格式控制字符的地方。

来自第7.1节

  

允许源文本中的格式控制字符有助于编辑和显示。所有格式控制字符都可以在注释中使用,也可以在字符串文字和正则表达式文字中使用。

附件E

  

7.1:在处理之前,不再从ECMAScript源文本中删除Unicode格式控制字符。在第5版中,如果此类字符出现在StringLiteralRegularExpressionLiteral中,则该字符将合并到第3版中的字面值中,该字符不会合并到字面值

有了这个,我得出结论,JavaScript在从右到左的角色上没有任何不同的操作。它只知道存储在字符串中的UTF-16代码单元,并且基于logical order工作。