2013-04-26 14 views
5

@thg435 bir javascript question bu cevabı yazdım:Bu regex neden Doğu Arapça rakamlarıyla çalışmaz?

> 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" 

Hindu-Arap rakamları ile iyi çalışır; 1, 1,2,3,4, ... Fakat normal ifadeleri Doğu Arap rakamlarına uyguladığımda başarısız olur. Burada kullandığım regex (Sadece [\u0660-\u0669] ile \d değiştirdik;) 'dir: benim dize ١٢٣٤foo olup olmadığı gerçekten çalışıyor

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

ama ١٢٣٤ foo hatta foo١٢٣٤ olduğunda başarısız:

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

neler Aslında benim için önemli olan rakamlar ayrılıyor (ör. ١٢٣٤). Neden ayrı sayılarla eşleşemez?

Güncelleme:

başka gereksinim regex sadece 5 veya daha fazla rakam (örneğin 12345 ve 1234) ile sayılar eşleşmesi gerektiğidir. Başlangıçta, ifadenin sonunda {5,} eklemenin bu kadar basit olduğunu düşündüm, ancak bu işe yaramıyor.

+1

http://www.unicode.org/reports/tr18/tr18-11.html –

+6

1234567890 bkz aslında arap rakamlarıdır;) – zeroflagL

+0

[bu] (http://stackoverflow.com/questions/12518689/regular-expression-not-to-allow-numbers-just-arabic-letters) – zeroflagL

cevap

1

Garip bir şekilde, karşıt davranışları deneyimliyorum (ilk iş işe yaramıyor ve diğer ikisi de var), ama \b'u (?![\u0660-\u0669]) ile değiştirdiyseniz nasıl olur? Sonra da sonuna ne olursa olsun iş gibi görünüyor:

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

Düzenleme: Bu yeni gereksinimi için çalışmak gibi - basamak işletilen 3 basamak uzunluğunda veya daha fazla ise parantez eklemek yalnızca:

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

arada, bazı Regex işlemciler \d için bir eşleşme olarak bu rakamları ele alacağız. İşte biraz daha kolay olmalı yerine bu karakter aralıkları \d, ikinci Regex okumak olmasıdır:

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

Nope'a yardımcı olabilir, ayrıca ' Çalış. – VisioN

+0

javascript'in dışında hemen hemen tüm regex motorları ile iyi çalışıyor .. javascript'in regex ile bir sorun .. aynı zamanda javascript – Anirudha

+0

içinde nested lookahead'ın desteği hakkında şüphelerim var Bu benim sorunumu çözdü. Sadece bir tane daha basit soru: Sadece 5 veya daha fazla sayı rakamını eşleştirebilirim (ör. 12345 ve 1234 değil)? {5,} bölümünü nereye eklemeliyim? – Iryn

İlgili konular