5

@thg435为一个 javascript问题写了这个答案:

> 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 位或更多位的数字(例如 ١٢٣٤٥ 而不是 ١٢٣٤)。我最初认为这就像{5,}在表达式末尾添加一样简单,但这不起作用。

4

1 回答 1

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]))

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

\d(?=\d{2}(\d{3})+(?!\d))|(?<=\d{2})\d(?=\d{2}(?!\d))
于 2013-04-26T17:20:26.677 回答