@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
,它实际上有效,但在١٢٣٤ foo
或foo١٢٣٤
时失败:
> 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,}
一样简单,但这不起作用。
答案 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))