【问题标题】:Ruby grep with string argument带有字符串参数的 Ruby grep
【发布时间】:2012-05-10 12:11:55
【问题描述】:

我想使用带有字符串的 grep 作为正则表达式模式。我该怎么做?

例子:

myArray.grep(/asd/i) #Works perfectly.

但我想先准备我的陈述

searchString = '/asd/i'
myArray.grep(searchString) # Fails

我怎样才能做到这一点?我需要准备一个字符串,因为这将进入搜索算法,并且查询会根据每个请求而改变。 谢谢。

【问题讨论】:

  • 当我说带字符串参数的 grep 失败时,它不会给出错误,但它也不会返回任何内容
  • 我有一个来自用户的查询,它是一个字符串
  • 这不是一个简单的问题。看this question

标签: ruby regex ruby-1.9


【解决方案1】:

正则表达式支持插值,就像字符串一样:

var = "hello"
re = /#{var}/i
p re #=> /hello/i

【讨论】:

  • 请注意,您可能希望在插入值之前对其进行转义,尤其是当它由不受信任的用户提供时:/#{Regexp.escape(user_provided_string)}/iRegexp.new(Regexp.escape(user_provided_string), "i")。例如,这将处理“。”作为文字“。”字符而不是“任何字符”。作为转义字符串将其转换为正则表达式的一种简短但神秘的方法,您可以使用Regexp.union(user_provided_string)
【解决方案2】:

引号中的内容与事物本身不同。 /a/i 是正则表达式,"/a/i" 是字符串。要从字符串构造正则表达式,请执行以下操作:

r = Regexp.new str
myArray.grep(r)

【讨论】:

  • Regexp.new('/asd/i') 返回一个正则表达式,如 (?-mix:\/asd\/i)?
  • @gkaykck 结果在我的机器上不一样,我仍然想强调的是正则表达式不是字符串。我只是向您展示如何从字符串构造正则表达式。在上面的例子中如果 str = "/u/" 那么 r 会变成 /\/u\// 这不是你想要的,我相信你可以弄清楚如何做你想要的
【解决方案3】:

试试这个:

searchString = /asd/i
myArray.grep(searchString)

【讨论】:

  • 我不能,我有一个来自用户的字符串,如何将该字符串与 /asd/i 合并?
【解决方案4】:

编辑:

我找到了更好的方法

myString = "Hello World!"
puts "Hello World!"
puts "Enter word to search"
input_search = gets.chomp
puts "Search insensitive? y/n"

answer = gets.chomp

if answer == "y"
  ignore = "Regexp::IGNORECASE"
else
  ignore = false
end

puts myString.lines.grep(Regexp.new(input_search, ignore))

下面是我的旧答案:

如果他们想要打开或关闭不敏感搜索等,请尝试将其设为 case 或 if 语句传递等

myString = "Hello World!"
puts "Enter word to search"
input_search = gets.chomp
puts "Search insensitive? y/n"
case gets.chomp
  when "y"
    puts myString.lines.grep(Regexp.new(/#{input_search}/i))
  when "n"
    puts myString.lines.grep(Regexp.new(/#{input_search}/))
end

【讨论】:

    【解决方案5】:

    '/asd/i' 是一个字符串。为什么不让它成为正则表达式?如果您需要从 String 转到 Regexp,一种方法是创建一个新的 Regexp 对象:

    >> re = Regexp.new('/asd/i')
    => /\/asd\/i/ 
    >> re = Regexp.new("asd", "i")
    => /asd/i 
    

    也许,

    >> str = gets.chomp #user inputs 
    => "Hello World"
    re = Regexp.new(str, "i")
    => /Hello World/i
    

    就是你要找的。​​p>

    但总的来说,我认为您不能简单地“将字符串用作正则表达式模式”,尽管我是初学者,对此可能有误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多