Eşleşen normal ifadeler


21

Buradaki göreviniz, her biri diğeriyle eşleşen, ancak kendisiyle eşleşmeyen iki normal ifade yazmak.

Her iki normal ifade de şu şekilde olmalıdır:

/pattern/optional-flags

Bu aynı zamanda eşleştirilmeleri gereken formdur.

En kısa çözüm kazanır. Çözüm uzunluğu, eğik çizgiler ve bayraklar dahil her iki normal ifadedeki karakterlerin toplamı olarak sayılır.

İstediğiniz bir regex sözdizimi standardı kullanın veya bir fark yarattığında bir programlama dili belirtin.

İyi eğlenceler!


Regex ayrıca diğer regex'in eğik çizgileri ve bayraklarıyla eşleşmek zorunda mı?
ProgramFOX

@ProgramFOX evet, netleştirmek için bir satır ekledim.
GOTO 0

Eşleşmeyi tanımlayabilir misiniz? yani regex yapar /a/maçı abc?
Şapkalı Adam

2
@TheGuywithTheHat iyi, bence, tüm dizgiyi eşleştirme ihtiyacı gibi belirli kısıtlamaları uygulayan bir dil seçmediğiniz sürece. Bu, endişenizi giderir mi?
GOTO 0

1
Açıkçası: Farklı sınırlayıcıların (örneğin, PHP PCRE tarafından izin verilen) kullanımına izin verilmediğini kabul ediyorum? (Gönderme yok /^%/ve %^/%)
Peter Taylor

Yanıtlar:


7

A değiştiricili PRCE: 9 karakter

/A$/
/.A/A

Her ne kadar bu Doorknob'un /modifier$/cevabının bir çeşidi olsa da , bu yeniliğin, onun üzerine bir yorum yapmaktan ziyade ayrı bir cevap olarak nitelendirildiğini düşünüyorum: değiştirici iki görevi yerine getiriyor. Yalnızca diğer regex'in eşleşmesi için orada olmak yerine, tutturur.

İlk regex değişmezde biten herhangi bir dizeyle eşleşir A. İkinci regex A, başlangıç karakteri olan bir bayrak kullanarak , ikinci karakteri değişmez olan herhangi bir dizeyle eşleşir .

Çevrimiçi demo


3
Bunu yenmek için sadece dört sınırlayıcı olmayan karakter gerekir ve bu //nedenle her regex'in sınırlayıcı olmayan en fazla üç karaktere sahip olabileceği anlamına gelir. PHP PCRE kullanıldığında, bu kısıtlama içinde 73339 eşleşmeyen regex vardır ve uzunluğu 10'dan küçük olan çiftlerin ayrıntılı kontrolü (çoğu, sınırlayıcılar da dahil olmak üzere 5 karakter olduğundan, 5.7Gpairs yerine 32Mpairs'in sırasına göre) ortaya çıkar. bu çözüm ve diğerleri yok. Bu nedenle, o belirli regex motoru için en uygun olduğunu iddia ediyorum.
Peter Taylor,

18

4 + 6 = 10 puan

İlk regex:

/i$/

İkinci regex:

/^.i/i

Bayrak kötüye kullanımı için Yaşasın! :-P

İlki ile biten her şey i(bu nedenle, ibayrak ile herhangi bir regex ) eşleşir .

İkincisi, ikinci karakterli herhangi birşeyle eşleşir i.

Alternatif versiyon: /i$/gve /g$/i.


3
Başka bir değişiklik olabilir /x.$/ve /^.x/bir sürü x
shiona için

Veya /i$/ve/\/$/i
Peter Taylor

Ya /i$/ve/i\$/i
Peter Taylor

6

JavaScript regexes, puan: 18

İlk regex:

/^[^a]+$/

İkinci regex:

/^[^b]+$/

JavaScript testi:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

Çevrimiçi sınama: http://jsfiddle.net/99Sx6/


5

Yakut regex, 15

Düzenli ifadeler:

/.{9}/
/^.{06}$/

Sadece karakterleri sayıyorum ...

Çevrimiçi sürüm

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2

5

4 + 6 = 10

İlk regex:

/i$/

İkinci regex:

/\/$/i

i$iikincisi ile biten bir şeyle eşleşir . ilki /$ile biten bir şeyle eşleşir /.


2
Bir yorum Dupe Doorknob'un cevabını yolladım.
Peter Taylor,

@PeterTaylor Şu ana kadar yorumları görmedim. Bunlar bağımsız keşiflerdi.
Justin

Evet, ben de Shiona'nın versiyonunu bağımsız olarak keşfettim.
Peter Taylor

3

5 + 5 = 10

Regex # 1:

/0.$/

Regex # 2:

/^.0/

Her 0iki regex'teki s, herhangi bir meta karakter içermeyen ile değiştirilebilir ve regex hala çalışır.

0.$kimin ikinci son karakter şeye uyar 0ve ^.0maçları ikinci karakter şey 0.


2
İlk çifti geçerli regexes değil: /es kaçmanız gerekir . Alternatif, Doorknob'un cevabı üzerine yapılan bir yorumdur.
Peter Taylor,

2

JavaScript regexes, puan: 13

İlk regex:

/\d/

İkinci regex:

/^[^0]+$/

Açıklama: ilk regex bir rakam içeren her şeye, ikinci regex a içermeyen her şeye uyar 0.

JavaScript testi:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

Çevrimiçi sınama: http://jsfiddle.net/5VYjC/1/



2

Puan: 5 + 5 = 10

Anlamak yarım saatimi aldı ama yaptığım için gerçekten çok mutluyum :)

Birincisi: /j.$/

İkincisi: /^.j/

Birinci j, sağdan başlayarak ikinci konumda meydana gelen eşleşir . 2nci jsoldan başlayarak ikinci konumda meydana gelenlerle eşleşir .

Test etmedim ancak bu RegEx'lerin jherhangi bir \wkarakterle (veya daha fazla?) Değiştirilebildiğinden gerçekten çok yönlü olduğunu ve hala iyi çalışması gerektiğini düşünüyorum.

PS Bu (umarım) herhangi bir dilde çalışması gerekir. Olsa da, herhangi bir işe yaramazsa, lütfen aşağıdaki yorumlarda bilgilendirin :)

Ölçek


Ve şimdi @ Quiccunx'un benimkiyle aynı versiyonu yayınladığını anladım. Gerçekten özür dilerim Quiccunx ve eğer herhangi biri olursa lütfen cevabımı sileceğim.
Gaurang,

1

PCRE değiştirici x: 11 karakter kullanıyor

/\s/
/ s.$/x

İlki, boşluk karakteriyle herhangi bir dizeyle eşleşir ancak boşluk içermez. İkincisi boşluk içerir, ancak xdeğiştirici nedeniyle yoksayılır ; penultimate karakteri olan herhangi bir dizeyle eşleşir s.

PCRE ve karakter sınıflarını kullanan diğer motorlar: 11 karakter

/\w+w/
/\Ww/

Birincisi, bir "kelime" karakterine sahip herhangi bir dize (harf, rakam, alt çizgi) ve ardından değişmez w; ikincisi, değişmez tarafından izlenen, sözcük olmayan bir karaktere sahip herhangi bir dizeyle eşleşir w.

PCRE ve karakter sınıflarını ve sözcük sınırı çapasını kullanan diğer motorlar: 11 karakter

/\w\w/
/\bw/

Birincisi, iki ardışık "kelime" karakterine sahip herhangi bir dizeyle eşleşir; İkincisi, sözcük olmayan bir karaktere sahip herhangi bir dize veya dizgenin başlangıcını takiben değişmez w.


-1

ECMAScript (11 bayt):

/^\1?d/
/\d/

Diğer REGEXP Motorları (14 bayt):

/^\\\\1?d/
/\d/

İlkleri \ d [..] veya \ 1d [..] ile eşleşir.

İkincisi, sayı içeren herhangi bir dizeyle eşleşir.

DÜZENLE:

Başlangıçta, bu cevap tüm motorlarla uyumlu olarak gönderildi, ancak yanlış olduğu kanıtlandı.

Yakalama gruplarına referanslarda bir sorun vardı (örneğin, php cinsinden).


Birçok regex motoru, regex'i çevreleyen eğik çizgileri olmadan alır, ancak soruların sayılmalarını gerektiren oldukça açıktır.
Peter Taylor

Cevap olarak saymıyorum. Bunun için not ekleyeyim.
Ismael Miguel

1
@PeterTaylor Notu ekledim. Apache sürümü orada çünkü.
Ismael Miguel

Bekle: ilk motor hangi motorlarda \1geri referans olarak yorumlanamaz?
Peter Taylor

Kullanma şeklinize bağlı olarak. Örneğin, php'de, eğer içine koyarsanız "/^\1?d/", başınız belaya girer, fakat yaparsanız sorun değil '/^\1?d/'. Kodlar yorumlandığında tırnak işaretleri büyük fark yaratır.
Ismael Miguel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.