为什么这个正则表达式不适用于东方阿拉伯数字?

时间:2013-04-26 17:01:29

标签: javascript regex

@thg435将此答案写入了javascript question

> a = "foo 1234567890 bbb 123456"
"foo 1234567890 bbb 123456"
> a.replace(/\d(?=\d\d(\d{3})*\b)/g, "[$&]")
"foo 1[2]34[5]67[8]90 bbb [1]23[4]56"

它适用于印度 - 阿拉伯数字;即1,2,3,4,......但是当我尝试将正则表达式应用于东方阿拉伯数字时,它失败了。这是我使用的正则表达式(我刚刚将\d替换为[\u0660-\u0669]):

/[\u0660-\u0669](?=[\u0660-\u0669][\u0660-\u0669]([\u0660-\u0669]{3})*\b)/g

如果我的字符串为١٢٣٤foo,它实际上有效,但在١٢٣٤ foofoo١٢٣٤时失败:

> a = "١٢٣٤foo  ١٢٣٤ foo  foo١٢٣٤"
"١٢٣٤foo  ١٢٣٤ foo  foo١٢٣٤"
> a.replace(/[\u0660-\u0669](?=[\u0660-\u0669][\u0660-\u0669]([\u0660-\u0669]{3})*\b)/g, "[$&]")
"١[٢]٣٤foo  ١٢٣٤ foo  foo١٢٣٤"

对我来说真正重要的是分开的数字(例如١٢٣٤)。为什么它不能匹配分隔的数字?

更新

另一个要求是正则表达式只应匹配5位或更多位数的数字(例如12345而不是1234)。我最初认为这就像在表达式末尾添加{5,}一样简单,但这不起作用。

1 个答案:

答案 0 :(得分:1)

奇怪的是,我遇到了与你相反的行为(第一个不起作用而其他两个行为不起作用),但是如果你用\b取代(?![\u0660-\u0669])怎么样?然后它似乎无论在它之前还是之后都有效:

[\u0660-\u0669](?=[\u0660-\u0669][\u0660-\u0669]([\u0660-\u0669]{3})*(?![\u0660-\u0669]))

编辑:这似乎适用于新要求 - 只有在数字长度为3位或更长时才添加括号:

[\u0660-\u0669](?=[\u0660-\u0669]{2}([\u0660-\u0669]{3})+(?![\u0660-\u0669]))|(?<=[\u0660-\u0669]{2})[\u0660-\u0669](?=[\u0660-\u0669]{2}(?![\u0660-\u0669]))

顺便说一句,一些Regex处理器会将这些数字视为\d的匹配项。这是第二个正则表达式\d而不是那些字符范围,这应该更容易阅读:

\d(?=\d{2}(\d{3})+(?!\d))|(?<=\d{2})\d(?=\d{2}(?!\d))