簡體   English   中英

我在哪里放置使用Regexp.new忽略特殊字符的選項?

[英]Where do I put the option to ignore special characters with Regexp.new?

這是代碼:

def autocomplete
    if(params[:terms]) 

    key = params[:terms]
    customers = Customer.where(:$or => [
        {:first_name => Regexp.new(/^#{key}/i)},
        {:last_name => Regexp.new(/^#{key}/i)},
        {:email => Regexp.new(/^#{key}/i)},
        #{:phone => Regexp.new(/^#{key}[d+]/i)},

        {:phone => Regexp.new(/^#{key.gsub(/\D+/,'')}/)},

        {:zip_code => key.to_i },   
        {:street1 => Regexp.new(/#{key}/i)},
        {:street2 => Regexp.new(/#{key}/i)}
    ]   
  )

Tin Man建議的gsub方法幾乎可以解決我的問題-僅在數據庫的:phone字段中搜索時,它才會從搜索字符串中刪除所有非數字字符。

最后一個問題是數據庫中的:phone字段中實際上可能包含非數字(並且我想允許用戶隨意輸入電話號碼),因此在搜索(使用時,我需要暫時忽略破折號)在Mongo中的find()

不知道是否應該在此級別的autocomplete函數中執行此操作,還是應該在autocomplete.js模塊中執行此操作...

簡介-我想要:phone.gsub(/ \\ D + /,''),但gsub僅適用於字符串,而不適用於此類引用。

我看到的一些東西:

Regexp.new(/^#{key}[d+]/i)}

[\\d+]是廢話。 刪除周圍的[]

對於:

{:zip_code => key.to_i },

不要將郵政編碼轉換為整數。 一些郵政編碼是帶連字符的,這將刪除尾隨的值。 另外,除非打算對值進行數學運算,否則請將其保留為字符串。

什么是$or 使用全局通常是代碼異味的標志。 在Ruby中使用一個的理由很少,而且我從未在代碼中找到一個很好的用途,而且通常可以使用常量輕松地重構它。


我想您實際上是通過指出ZIP的key.to_i來回答我的問題的-實際上這正是我想使用的電話號碼-刪除了所有的破折號,空格,方括號等。我將嘗試一下。

不不不不。 to_i不會做你想要的。 '0-1'.to_i => 0'0.1'.to_i => 0 相反,您想使用gsub從字符串中gsub所有非數字字符,然后完成:

'0.1'.gsub(/\D+/, '')
=> "01"
'123-456-7890'.gsub(/\D+/, '')
=> "1234567890"
'(123) 456 7890'.gsub(/\D+/, '')
=> "1234567890"

'0.1'.gsub(/\D+/, '').to_i
=> 1

請注意,當to_i收到"01" ,上面發生了什么,前導零被刪除了,因為它對Fixnum的表示並不重要。 您可以強制使用字符串格式顯示它,但是為什么呢? 電話號碼不是數字值,而是字符串值,即使它是一堆數字。 我們永遠不需要對它們進行加法運算或任何數學運算,因此將其轉換為整數是毫無意義的。 將其保留為一串數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM