CSS raqamli ifodasini ajratuvchi va tekshiruvchi

Mavjud loyiha uchun CSS3 ning : nth-child() da ishlatiladiganlarga o'xshash sonli ifodalarni ajratish va tekshirish kerak. Asosan, ifoda a + b , bu erda a va b tamsayı qiymatlari bo'lishi kerak (har ikkala ijobiy va salbiy). Ular 0 ga teng bo'lishi mumkin.

Hamma narsani aniqroq qilish uchun ba'zi bir misollar: 2n + 1 , 2n , 4 va n + 2 . Asosan, a va b har qanday tamsayılar, imzolangan yoki imzosiz.

Quyidagi misollar:

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

barchasi tegishli. Bu faqat a yoki b tamsayı emas, yoki ifoda boshqa bir belgi bo'lsa muvaffaqiyatsiz bo'lishi kerak.

Ushbu iboralarni qanday tahlil qilish va tasdiqlash mumkinligini bilishni istayman; Men to'g'ri echim REGEXs deb hisoblayman, ammo buning uchun qanday qilib qurishim mumkinligini bilmayman.

0
Agar taqdim etilgan iboralar REGEX bilan mos keladigan bo'lsa, u haqiqiy va shuning uchun tasdiqdan o'tish kerak. Men REGEXning o'zi bilan ko'proq qiziqaman. Buni PHP-dan foydalandim.
qo'shib qo'ydi muallif linkyndy, manba
@CodeJockey, men buni PHP dasturida bajaraman. Sizning sharhingizga sharhda qo'shimcha misollar keltirdim.
qo'shib qo'ydi muallif linkyndy, manba
Iltimos, yaqinroq bo'lishi mumkin bo'lgan narsalarni misollarni keltiring, lekin tekshirishni o'tkazmaslik kerak
qo'shib qo'ydi muallif Code Jockey, manba
Ushbu iborani qaysi til ishlatmoqda? Java? PHP? .Net? JavaScript-ni? Bundan tashqari, b uchun +1 natija ega bo'lish istalmagan yoki maqbulmi?
qo'shib qo'ydi muallif Code Jockey, manba
@linkyndy, oh, afsus, men sizni "tekshirish" degan joyda "baholash" ni o'qiyman. Fikrimni aslo unutmang.
qo'shib qo'ydi muallif Bart Kiers, manba

2 javoblar

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

Agar ular haqiqiy qiymatlar bo'lsa:

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

Va bular noto'g'ri:

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

u holda bu ibora quyidagilarni tasdiqlashi kerak:

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

Ushbu ibora quyidagilarni aytadi:

^           # 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 ni tekshirishga urinib ko'radi, ammo u yo'q bo'lsa, bunga umid qilmaydi.

EDIT:

Yuqoridagi ifoda tasdiqlash kerak bo'lsa-da, bu iboralar siz izlayotgan natijalaringizni aniqroq ko'rsatishi kerak. Buning uchun a va b nomi berilgan guruhlardan foydalaning. b kodini kiriting va + belgisini chiqarib tashlamang, faqat salbiy raqamlar uchun - belgisini yozing:

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

Natijalar quyidagicha bo'lishi kerak:

 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+)?)$

Buning sababi n + 2 , 2 va 12n + 2 uchun "n" ifodasini yoki hech narsa yo'qligini bildiradi, :

 source    n        a       b
------     ------  ------  ------
 2                          2
 n+2       n                2
 12n+2     12n      12      2
n + 2 joriy bo'lishi kerak. Asosan, a va b har qanday tamsayılar, imzolangan yoki imzosiz. 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 (A = 2, b = -2) , -1 (a = 0, b = -1) , -2n (a = -2, b = 0) barcha tegishli. Bu faqat a yoki b tamsayı bo'lmasa yoki ifoda uchun boshqa belgilar mavjud bo'lsa bajarilmasligi kerak.
qo'shib qo'ydi muallif linkyndy, manba
Sizning juda batafsil javobingiz uchun rahmat!
qo'shib qo'ydi muallif linkyndy, manba

^ (?: (?: (-? \ D *) n)? ([+ -] \ d +)? (\ D +)) $ kabi narsalarni xohlaysizmi? Bu ikki muvaffaqiyatli qo'lga olish guruhidagi ikki raqamni qaytaradi.

1
qo'shib qo'ydi
Shunday qilib, bu a va b raqamlari to'g'ri shakllantirilganligini (tamsayılarmi) qaytaradi? Bundan tashqari, mag'lubiyatga a + b ifodasidan tashqari biron narsa kiritilmasligi kerak. Siz buni kod snippetida ko'rib chiqdingizmi? Kechirasiz, lekin REGEXda mening mahoratim juda past ... :)
qo'shib qo'ydi muallif linkyndy, manba
Izohlaringiz uchun tashakkur. Bilaman, ularni o'rganishim kerak.
qo'shib qo'ydi muallif linkyndy, manba
bu ikkinchi raqamni ikkita ta'qib qilish guruhidan biriga (ikkinchi yoki uchinchi) kiradi va sizning tilingizda + <<> kodi bilan parchalanish satrini tekshirishi mumkinligini bilish uchun + /code> 'p, lekin buni tuzatish mumkin. Aks holda, bu to'g'ri! ^ (?: (?: (-? \ D +) n)? ([+ -]? \ D +)?) $
qo'shib qo'ydi muallif Code Jockey, manba
Agar string to'g'ri bo'lsa, u faqatgina mos keladi. Agar mos keladigan bo'lsa, raqamlarni ta'qib qilish guruhlari sifatida qaytaradi. Ro'yxatlarni o'rganishingiz kerak.
qo'shib qo'ydi muallif SLaks, manba
@SLaks, siz taklif qilgan yechim bo'sh satrga ham mos keladi: bu to'g'ri deb o'ylamayman.
qo'shib qo'ydi muallif Bart Kiers, manba
PhP |BotsUz
PhP |BotsUz
93 ishtirokchilar

Phpni o'rganishni Hohlasangiz https://t.me/joinchat/AAAAAE-KRc5dd5tPMmGmWA A'zo bo'lin