2015-02-20 28 views
19

Sadece normal ifadeyi ruby'de ayıklamaya çalışıyorum. Normal bir ifadenin içeriğini gösterdiğimde, bu karakterler ifadenin bir parçası olmasa bile düzenli açıklamanın başında ?-mix gösterir. Aşağıdaki IRB çıktı görmeye bkz Eğer düzenli ifadenin içeriğine yazdırmak için koyar kullandığınızda, gördüğünüz gibi buBir Ruby Düzenli İfadede '? -mix' nedir

irb(main):028:0* EXPR = /^a$/ 
=> /^a$/ 
irb(main):029:0> EXPR 
=> /^a$/ 
irb(main):030:0> puts EXPR 
(?-mix:^a$) 
=> nil 

resimli Lütfen başında ?-mix yoktur. Bu konuda endişelenmeli miyim? Nereden geliyor?

cevap

26

mix, İngilizce sözcük karışımı değil, Regexp seçenekleri.

Regexp#to_s bakınız:

normal ifadeyi ve (?opts:source) gösterimi kullanılarak seçeneklerini (içeren bir dize döndürür sizin örnekte

, msatırlı modu, i içindir. büyük harf duyarlı olmayan ve x için genişletilmiş mod içindir. Kısa çizgi öncesi seçenekler, kapatıldıktan sonra kalanlar (varsayılan). Sorunun örneği, ?-mix, tüm seçenekleri kapalı. o bayraklar için bir sözdizimi var - İlişkin

puts /^a$/mix 
# =>(?mix:^a$) 
+0

harika, bunun için teşekkürler. Bu m seçeneğim reg ex'imi mahvediyor olabilir. Bunun yerine, tek satırlık olarak ayarlamayı öğrenmeniz yeterlidir. – Zephilim

+0

Bu seçenek, '' '' nin bu seçenekleri * kapattığını (varsayılan değerde olduklarını, ancak bunları farklı bölümler için açıp kapatabileceğinizi de dikkate alabilir) regex aromanız destekliyorsa regex. –

+0

@Shantaram: Ruby'nin (? M) 'nin diğer tüm normal ifade (' s) 'seçenekleriyle aynı olduğunu biliyor musunuz? '^' Ve '$' ile eşleşmesi için ne bekliyorsunuz? –

10

:

Sen gibi onları açabilirsiniz. Çizgi öncesi olanlar yanıyor ve sonra olanlar kapalı.

bir regexp'nin bitiş sınırlayıcı bir veya daha fazla tek harfli seçenekleri takip nasıl desen olabilir kontrol:

Regexp docs içinde expalined olarak

bu (?on-off) sözdizimi kullanılarak, bir satır içi değiştirici maç.

  • /pat/i - desen
  • /pat/o içerisinde boşluk ve yorum yok saymak - - .
  • /pat/x ile eşleşen bir karakter olarak bir yeni satır Treat -
  • /pat/m durum göz ardı sadece bir kez
  • #{} interpolasyon gerçekleştirin

i, m, ve x, parantez ekspresyon için kapalı seçenekleri seçenekleri üzerinde sağlar (?on-off) yapısı ile alt ifade düzeyinde uygulanır ve devre dışı olabilir.

Dolayısıyla, benim durumumda bu seçeneği m, i demektir ve x kapalıdır ve hiçbiri vardır.

İlgili konular