2013-04-26 31 views
5

@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,}即可,但這不起作用。

+1

看到http://www.unicode.org/reports/tr18/tr18-11.html – 2013-04-26 17:06:59

+6

1234567890實際上是阿拉伯數字;) – zeroflagL 2013-04-26 17:14:33

+0

[this](http://stackoverflow.com/questions/12518689/regular-expression-not-to-allow-numbers-just-arabic-letters)可能有幫助 – zeroflagL 2013-04-26 17:18:02

回答

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)) 
+0

沒有,它也沒有'工作。 – VisioN 2013-04-26 17:21:40

+0

幾乎所有的正則表達式都可以正常工作,除了javascript的..這是一個JavaScript的正則表達式的問題..我也懷疑嵌套在JavaScript中的lookahead的支持 – Anirudha 2013-04-26 17:34:23

+0

這解決了我的問題。只有一個簡單的問題:我怎樣才能匹配5個或更多的數字(例如12345而不是1234)?我應該在哪裏添加{5,}? – Iryn 2013-04-26 19:05:09

相關問題