CSS sayısal ifade ayrıştırıcısı ve doğrulayıcısı

Şu anki projem için CSS3'ün : nth-child() 'sinde kullanılanlara benzer sayısal ifadeleri ayrıştırıp doğrulaması gerekiyor. Temel olarak, ifade a + b şeklindedir, burada a ve b tamsayı değerleri olmalıdır (hem pozitif hem de negatif). Ayrıca 0 'a eşit olabilirler.

Her şeyi daha net hale getirmek için bazı örnekler: 2n + 1 , 2n , 4 ve n + 2 geçerli olmalıdır . Temel olarak a ve b , imzalanmış veya imzasız herhangi bir tamsayıdır.

Aşağıdaki örnekler:

  • n (a=1, b=0)
  • n+1 (a=1, b=1)
  • 1 (a=0, b=1)
  • 2n+1 (a=2, b=1)
  • 23n+45 (a=23, b=45)
  • 2n-2 (a=2, b=-2)
  • -1 (a=0, b=-1)
  • -2n (a=-2, b=0)

hepsi geçerli. Bu, yalnızca a veya b bir tam sayı değilse veya ifadede başka bir karakter varsa başarısız olur.

Bu ifadeleri nasıl ayrıştırıp doğrulayabilirim bilmek isterim; Uygun bir çözümün REGEX'ler olacağına inanıyorum ama bunun için nasıl bir tane oluşturabilirim bilmiyorum.

0
Gönderilen ifade REGEX ile eşleşirse, doğru olarak döndürülmeli ve bu nedenle doğrulama iletilmelidir. REGEX'in kendisi ile daha çok ilgileniyorum. Bunu PHP'de kullanıyorum.
katma yazar linkyndy, kaynak
@CodeJockey, bunu PHP'de yapıyorum. Cevabınıza bir yorumda daha fazla örnek verdim.
katma yazar linkyndy, kaynak
Lütfen yakın olabilecek bir şey örnekleri verin, ancak geçerliliği geçmemelidir.
katma yazar Code Jockey, kaynak
Bu ifadeyi hangi dil kullanıyor? Java? PHP? .Ağ? JavaScript? Ayrıca b için +1 sonucunun olması istenmeyen veya kabul edilebilir mi?
katma yazar Code Jockey, kaynak
@linkyndy, ah, özür dilerim, "doğrula" dediğin yerde "değerlendir" okudum. Yorumumu boş ver.
katma yazar Bart Kiers, kaynak

2 cevap

DÜZENLEME: revised to allow negative numbers as specified in the question END EDIT

Bunlar geçerli değerler ise:

5n+12   3456    -5     2     123n+6  8n    13n-6    n+2

Ve bunlar geçersiz:

25n.1   4x+4    2n+    6N-2  8n-+5   n+-3  Rn+T     x+1

o zaman bu ifade doğrulanmalıdır:

^(-?\d+(n([+-]\d+)?)?)$

Bu ifade şöyle diyor:

^           # Assert beginning of line
(\d+        # Match one or more digits
  (n        #   TRY to Match a literal n character
    (\+\d+  #     TRY to match a literal plus character followed by one or more digits
    )?      #     END TRY
  )?        #   END TRY
)           # End Match
$           # Assert at end of string

TRY ler doğrulamayı dener, ancak orada değilse sorun olmaz.

DÜZENLEME:

Yukarıdaki ifade doğrulanmasına rağmen, bu ifade, aradığınız sonuçları, a ve b adlı yakalama gruplarını kullanarak ve yalnızca sayıları yakalamak için olumlu bir görünüm üretmelidir. kod> a ve b ve + sembolünü hariç tutmak için, ancak negatif sayılar için yalnızca - sembolünü yakalayın:

^(?:(?:(?P-?\d*)n)?(?=[+-]?\d+|$)\+?(?P-?\d+)?)$ 

Sonuçlar aşağıdaki gibi olmalıdır:

 source     a       b
------     ------  ------
 5n+12      5       12
 3456               3456
 2                  2
 123n+6     123     6
 8n         8           
 -5                 -5
 13n-6      13      -6
 n+2                2
 n

Because I am not completely sure how the vs ,zero length or null string> dichotomy works in PHP and preg_match_all, I would recommend using this expression if you encounter any problems differentiating between the results for n+2 and 2:

^(?:(?P(?P-?\d*)n)?(?=[+-]?\d+|$)\+?(?P-?\d+)?)$ 

Bu, "n" ifadesinin tamamını ya da hiçbiri yoksa n + 2 , 2 ve 12n + 2 için hiçbir şey yakalamaz. :

 source    n        a       b
------     ------  ------  ------
 2                          2
 n+2       n                2
 12n+2     12n      12      2
3
katma
n + 2 geçerli olmalıdır. Temel olarak a ve b , imzalanmış veya imzasız herhangi bir tamsayıdır. n (a = 1, b = 0) , n + 1 (a = 1, b = 1) , 1 (a = 0, b = 1 ) , 2n + 1 (a = 2, b = 1) , 23n + 45 (a = 23, b = 45) , 2n -2 (a = 2, b = -2) , -1 (a = 0, b = -1) , -2n (a = -2, b = 0) hepsi geçerlidir. Bu, yalnızca a veya b tam sayı değilse veya ifadede başka karakterler varsa başarısız olur.
katma yazar linkyndy, kaynak
Çok detaylı cevabınız için teşekkür ederiz!
katma yazar linkyndy, kaynak

^ (?: (?: (-? \ D *) n)? ([+ -] \ d +)? | (\ D +)) $ gibi bir şey mi istiyorsunuz.
Bu, iki başarılı yakalama grubundaki iki sayıyı döndürecektir.

1
katma
Yani, bu a ve b sayılarının doğru şekilde biçimlendirilmiş (tamsayılar) olup olmadığını döndürür? Ayrıca, dize, an + b ifadesinden başka bir şey içermemelidir. Bunu kod snippet'inizde dikkate aldınız mı? Üzgünüm, ama REGEX'teki becerilerim çok düşük ... :)
katma yazar linkyndy, kaynak
Açıklamalarınız için teşekkür ederim. Biliyorum, onları öğrenmeliyim.
katma yazar linkyndy, kaynak
Bu, ikinci sayıyı iki yakalama grubundan (ikinci veya üçüncü) birine taşır ve + yakalar - dilinizin + 's, ama bunu düzeltebilirsiniz. Aksi takdirde geçerli! ^ (?: (?: (-? \ d +) n)? ([+ -]? \ d +)?) $ 2 gruba ayrılır
katma yazar Code Jockey, kaynak
Sadece dize doğruysa eşleşecektir. Eşleşirse, sayıları yakalama grupları olarak döndürür. İntikamları öğrenmelisin.
katma yazar SLaks, kaynak
@SLaks, önerilen çözümünüz de boş bir dizeyle eşleşiyor: Bunun doğru olduğunu düşünmüyorum.
katma yazar Bart Kiers, kaynak