Ruby düzenli ifadelerinde \ A \ z ve ^ $ arasındaki fark


196

Belgelerde okudum:

Dizenin başlangıcını ve sonunu eşleştirmek için \ A ve \ z tuşlarını, satırın başlangıcını / bitişini ^ ve $ eşleştirin.

Kullanıcı tarafından gönderilen kullanıcı adını (veya e-posta aynıdır) kontrol etmek için normal bir ifade uygulayacağım. validates_format_ofModelde hangi ifadeyi kullanmalıyım ? Farkı anlayamıyorum: Her zaman ^ ve $ kullandım ...


Yanıtlar:


226

Eğer doğrulama için düzenli ifade bağlı ediyorsanız, her zaman kullanmak istiyorum \Ave \z. ^ve $yalnızca yeni satır karakterine kadar eşleşir, yani me@example.com\n<script>dangerous_stuff();</script>normal ifade yalnızca \n.

Tavsiyem, önceden bir kullanıcı adından veya e-postadan tamamen yeni satırlar çıkarmak olacaktır, çünkü bir tanesinin meşru bir nedeni yoktur. O zaman güvenle EITHER \A \zveya kullanabilirsiniz ^ $.


13
@ Ragmaanir haklı, bunun \zyerine küçük harfli olmalı \Z!
Petr

11
+1 Teşekkürler! Tavsiyenize katılmama rağmen: A) Uygun bir yakalama varsa gereksiz iş / işleme eklemeyin ve B) özellikle ikisi arasında ayrım yapma konusunda tembel kalmanıza izin veriyorsa değil. Her zaman dize manipüle etmek için bir konumda olmayabilirsiniz, sadece Regex'e, bu yüzden doğru olanı hafızaya alın ve farkı bilin!
dooleyo

1
Tehlikeli şeylerle ilgili örneği anlamadım çünkü her iki durumda da ipte tehlikeli şeyler içerebilir, yeni satırlar olsun veya olmasın, html sanitize etme ve doğrulama ile düzeltilmesi gereken bir istismar olurdu.
Jayr Motta

2
@JayrMotta, gösterdiği gibi, tehlikeli şeylerin tüm regex kontrolünüzü tamamen atlayacağı yönündedir . Regex'inizde tehlikeli şeyleri kontrol ediyor olsanız bile, $yerine "dizenin sonu" nu kontrol ederseniz bu baypaslanırdı \z.
Doctor Blue

178

Kazma'ya göre :

^ Bir satırın başlangıcıyla eşleşir.

$ Satırın sonuyla eşleşir.

\A Dizenin başlangıcıyla eşleşir.

\z Dizenin sonuyla eşleşir.

\Z Dize a ile bitmediği sürece dizenin sonuyla "\n"eşleşir, bu durumda hemen öncesiyle eşleşir "\n".

Yani, kullanın \Ave küçük harf \z. Eğer \Zbirini kullanırsanız bir satırsonu karakterine gizlice girebilirsiniz. Bu tehlikeli değil bence, ancak dizede boşluk olmadığını varsayar algoritmalar berbat olabilir. Normal ifadenize ve dize uzunluğu kısıtlamalarınıza bağlı olarak, birisi yalnızca yeni satır karakteri ile görünmez bir ad kullanabilir.

JavaScript'in Regex uygulamasını \Agerçek 'A'( ref ) olarak kabul eder . Öyleyse kendine dikkat et ve test et.


16

Bir dizenin başlangıcı ve bitişi mutlaka bir çizginin başlangıcı ve bitişi ile aynı şey olmayabilir. Aşağıdakileri test dizeniz olarak kullandığınızı düşünün:

Benim
adım
olduğunu
Andrew

Dizenin içinde birçok satır bulunduğuna dikkat edin - ^ve $karakterleri bu satırların başlangıcını ve sonunu eşleştirmenize izin verir (temelde \nkarakteri bir sınırlayıcı olarak ele alır) \Ave \Ztüm dizenin başlangıcını ve sonunu eşleştirmenize izin verir.


1
Bence en iyi cevap. "temelde \ n karakterine bir sınırlayıcı gibi davranmak" gerçekten anlamama yardımcı oldu, teşekkür ederim.
Flyout91

11

Örnekle Fark

  1. /^foo$/aşağıdakilerden herhangi biriyle eşleşir, eşleşmez /\Afoo\z/:
whatever1
foo
whatever2
foo
whatever2
whatever1
foo
  1. /^foo$/ve /\Afoo\z/tümü aşağıdakilerle eşleşir:
foo
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.