13

eşleşen ben Postgresql ve ActiveRecord: Regex

/(first|last)\s(last|first)/i 

Ben tüm kayıtları almaya çalışıyorum

first last 
Last first 
First Last 
First name 

ilk üç maçları Regex

normal bu regex yarattı nereye full_name maçlar ile Yazdığım regex. PostgreSQL

Bu girişimi kullanıyorum. Ben de hiçbir şans ile SIMILAR TO ve ~ denedik

cevap

36

Sizin GİBİ sorgusu:

full_name ilike '%(first|last)%(last|first)%' 
LIKE regex gruplama ( (...)) veya değişiklik ( |) anlamıyor çünkü

çalışmaz, GİBİ yalnızca _ anlar Sıfır veya daha fazla karakter dizisi için tek bir karakter (bir normal ifadede .) ve % (bir normal ifadede .* gibi).

Eğer bu modeli BENZER İKİZE gönderirseniz, 'first last' bulursunuz, ancak sorunlardan dolayı diğerlerinden hiçbirini alamazsınız; Bununla birlikte, bu sorunla ilgilenir ve regex'inizle aynı olanları bulursunuz:

lower(full_name) similar to '%(first|last)%(last|first)%' 

.

Eğer bir regex kullanmak istiyorsanız (büyük ihtimalle LIKE çok sınırlı ve hantal ve SIMILAR TO, bazı SQL standartları alt komitesinin ateşli zihinlerinin garip bir ürünüdür) bunu kullanmak isteyeceksiniz. küçük harf duyarsız eşleştirme operatörü ve orijinal regex: AR bu bit çevirir

full_name ~* '(first|last)\s+(last|first)' 

:

Person.where('full_name ~* :pat', :pat => '(first|last)\s+(last|first)') 
# or this 
Person.where('full_name ~* ?', '(first|last)\s+(last|first)') 

sen dikkate almak gerekir benim kodunda ince bir değişme var: Ben Ruby dizelerim için tek tırnak kullanarak m, çift kullanıyorsunuz tırnak. Ters eğik çizgi, çift tırnaklı dizgelerde, tek tırnaklı dizgilerdekinden daha fazla demektir, bu nedenle '\s' ve "\s" farklı şeylerdir. Birkaç to_sql aramalar atmak ve ilginç bir şey görebilirsiniz: Aradaki fark muhtemelen size herhangi bir soruna neden değil

> puts Person.where('full_name ~* :pat', :pat => 'a\s+b').to_sql 
SELECT "people".* FROM "people" WHERE (full_name ~* 'a\s+b') 

> puts Person.where('full_name ~* :pat', :pat => "a\s+b").to_sql 
SELECT "people".* FROM "people" WHERE (full_name ~* 'a +b') 

ancak herkes aynı çıkış karakterini kullanmak istediğinde sizin dizeleri çok dikkatli olmak gerekir. Kişisel olarak, çift tırnaklı dizgelerin ekstra kaçış ve dizgi enterpolasyon işlevine özellikle ihtiyacım olmadıkça tek tırnaklı dizeleri kullanıyorum.

Bazı demolar: http://sqlfiddle.com/#!15/99a2c/6

+1

Bu benim teşekkür, burada aldık en iyi yanıtlar biridir. '+' öğesine ihtiyacım yok çünkü tüm kayıtların yalnızca tek bir alana sahip olduğundan eminim. ': pat' sembolünü kullanmanın nedeni, regex değerini daha sonra doğru olarak tanımlamaktı? Ayrıca, SQL'e birden çok değer aktarmam gerekirse, o zaman semboller oluşturmak değerleri takip etmeyi sağlar. – Patrick

+1

'yerine': 'yerine'?Bunu biraz daha okunabilir hale getirmek için, sadece bir yer tutucu olduğunda çok fazla bir şey yoktur, ancak daha fazla olduğunda veya aynı değeri birkaç yerde kullanmanız gerekiyorsa yapar. Bir şeylerin isimlerini vermek okunabilirlik kazanma IMO'dur. Neyse, teşekkürler, puanlarımı kazanmak istiyorum ve benden daha çok şey öğreniyorsunuz :) –

+3

FYI: Eğer MySQL kullanıyorsanız, '~ * operatörü mevcut değil. Bunun yerine, yerine "REGEXP" kullanın. – jerzy