2016-03-23 17 views
1

Verileri, normalde herhangi bir kodun yardımı olmaksızın, normal ifadeyle yapılması gereken belirli bir şekilde vermem gerekiyor. o başlar ve yukarıda biter ama aynı zamanda herhangi bir lider sıfırları kaldırmak istediğim yere alt dizeyi dönmek istiyorumBir alt dizeyi döndür ve normal ifadeleri kullanarak sonuçta sıfırları sil?

%O1TEST  00000500135800? 
      ^start ^end 

:

İşte sabit pozisyon/uzunluğudur benim girdi dizedir. Son sonuç "5001" olacaktır.

Altyazı "123455001" ise, "123455001" (tüm 9 karakter) döndürür.

Şimdiye kadar var: "000005001" döndüren .{13}(.{9}) ancak baştaki sıfırları nasıl kaldıracağımı anlayamıyorum.

+0

5001’den sonraki bölümü neden göz ardı ettiniz? –

+0

5001'den sonraki bölüm, istemediğim diğer verilerdir. Ben sadece 9 karakterin 14. pozisyondan başlayıp 22. pozisyonda bitmesini istiyorum. – Clutch

+0

Nihai amaç nedir? Sadece sql sözdizimini kullanarak 5001'e ihtiyacınız var? Bir ip olarak ya da bir sayı olarak ihtiyacınız var mı? Hangi veritabanı sistemi? numara ayrıştırması ve tür dönüşümü gibi diğer sql yöntemleriyle bir regex'i birleştirebilir misiniz? –

cevap

1

javascript, bu maç gruptaki 1 size 5001 verecek:

'%O1TEST  00000500135800?'.match(/^.{13}0*(\d*).{6}$/) 

bu toplam dize uzunluğunu bilmesini gerektirir. ^.{13}, ilk 13 karakterle eşleşir, .{6}$ son 6 karakterle eşleşir, 0* tüm önde gelen sıfırları alır ve (\d*) kalan sayılarla eşleşir.

Nihayetinde neye ihtiyacın olduğu ve diliniz hakkındaki yorumumu yanıtlayabilirseniz size daha iyi bir yanıt verebilirim. Tüm regex tatları eşit oluşturulmaz.

+0

Yaptın! Üzgünüm, ama sorumu daha iyi ifade etmeliydim. Teşekkür ederim! – Clutch

0

Yakalama grubunuz tüm karakterleri 14'ten 22'ye kadar alıyor, dolayısıyla onu sınırlamanız gerekiyor.

.{13}0*([0-9]+)[0-9]{5} 

Bilmiyorum: ilk 13 karakteri göz ardı çünkü şu regex sonra herhangi bir baştaki sıfırları göz ardı eder ve tüm basamaklar sıfırların herhangi dizisinden sonra ve son beş rakamını önce yakalar, iş yapmalıyım Ne deniyorsun, ama bu regex, sadece sonuncusu yakalayan, 00000000035800 dahil olmak üzere herhangi bir lider sıfırları kabul eder. Bu durumda sonuç 0 olur.

sen sağlamak için normal ifadeler değiştirirseniz:

.{13}0*([0-9]*)[0-9]{5} 

Ayrıca diziyi 00000000035800 maç olacak ama boş bir dize yakalama grubu tarafından iade edilecektir.

Gereksinimlerinize daha uygun olanı kullanın.

0

Mark Evaul's answer ile eşleşen bir alandaki karakterlerin büyük olduğundan emin olun. Rakamlardan emin değilseniz, bu oldukça zor.

Maalesef, yakalanan bir niceleyiciyle yapabileceğiniz tek şey, sonraki eşleşmelerde birçok kez yinelenmesidir: http://www.rexegg.com/regex-quantifier-capture.html Ve hatta bu, gerçekten gelişmiş düzenli diller tarafından desteklenir.

Böylece tüm olası kombinasyonları numaralandırma saplanmışsın, minnetle sadece 10 vardır:

\s(?:([1-9]\d{8})|0([1-9]\d{7})|0{2}([1-9]\d{6})|0{3}([1-9]\d{5})|0{4}([1-9]\d{4})|0{5}([1-9]\d{3})|0{6}([1-9]\d{2})|0{7}([1-9]\d)|0{8}([1-9])|0{9}()) 

Live Example

boşluk biz maçı baştan sayısını eşleşen sağlayacaktır.

  • %O1TEST 00000500135800?
  • %O1TEST 000000500135800?
  • %O1TEST 000005001358000?
  • : Her seçenek 0 ile 9

    Bu normal ifade gibi şeyler eşleşen yeteneğine sahip lider 0s değişen sayıda 9 basamak toplam olduğu

Sayının büyüklüğünden bağımsız olarak sadece ilk 9 karakter alınacak ve baştaki sıfırlar maçtan kesilecektir.

İlgili konular