【问题标题】:Ruby on Rails: Checking for valid regex does not work properly, high false rateRuby on Rails:检查有效的正则表达式无法正常工作,错误率高
【发布时间】:2016-08-22 18:34:07
【问题描述】:

在我的应用程序中,我有一个程序应该检查输入是否有效。您可以为此输入设置正则表达式。

但在我的情况下,它返回 false 而不是 true。而且我找不到问题。

我的代码如下所示:

gaps.each_index do | i |
if gaps[i].first.starts_with? "~"
  # regular expression      
    begin
     regex = gaps[i].first[1..-1]
     # a pipe is used to seperate the regex from the solution-string
     if regex.include? "|"
       puts "REGEX FOUND ------------------------------------------"
       regex = regex.split("|")[0..-2].join("|")
     end
     reg = Regexp.new(regex, true)
     unless reg.match(data[i])
     puts "REGEX WRONGGGG -------------------"
     @wrong_indexes << i
     end
   rescue
  end
  else
   # normal string
   if data[i].nil? || data[i].strip != gaps[i].first.strip
     @wrong_indexes << i
    end      
  end

一个例子是:

[[~berlin|berlin]] 

管道前面的左边是正则表达式,管道旁边的右边是正确的解决方案。

这个简单的输入应该返回真,但它没有。

有人发现问题了吗?

谢谢大家

编辑

这行中的某个地方一定是问题所在:

if regex.include? "|"
   puts "REGEX FOUND ------------------------------------------"
   regex = regex.split("|")[0..-2].join("|")
 end
 reg = Regexp.new(regex, true)
 unless reg.match(data[i])

更新:没有~的结果

【问题讨论】:

标签: ruby-on-rails ruby regex ruby-on-rails-4


【解决方案1】:

重点是您正在使用 Regexp constructor 初始化正则表达式

从模式构造一个新的正则表达式,可以是StringRegexp(在这种情况下传播正则表达式的选项,并且可能不指定新选项(a从 Ruby 1.8 开始更改)。

但是,当您将regex(通过regex.split("|")[0..-2].join("|") 获得)传递给构造函数时,它是一个字符串,而reg = Regexp.new(regex, true) 正在获得~berlin(或/berlin/i)作为文字字符串模式。因此,它实际上是在寻找你意想不到的东西。

看,regex= "[[/berlin/i|berlin]]" 只能找到 *literal /berlin/i 文本(参见 demo)。

另外,您需要从[[...]] 中获取模式,所以用regex = regex.gsub(/\A\[+|\]+\z/, '').split("|")[0..-2].join("|") 去掉这些括号。

请注意,您不需要指定不区分大小写的选项,因为您已经将true 作为第二个参数传递给Regexp.new,它已经不区分大小写了。

如果您正在执行整个单词查找,请添加单词边界:regex= "[[\\bberlin\\b|berlin]]"(请参阅demo)。

【讨论】:

  • 很抱歉,但这不起作用......有没有可能改变它,让我可以使用普通的正则表达式?
  • 如果我做 \\bberlin\\b --- 我测试 berin 我得到了错误
  • @Felix: berlin != berin。不能将字符串用作文字正则表达式对象。您必须使用 Regex 构造函数,然后不能使用 /.../ regex 分隔符。见Is it possible to create a dynamic regular expression in Ruby
  • 我已经看到正则表达式构造函数已经过时了.. rube 2.x 有什么新东西
  • 你能给我一个可行的例子吗?完全支持正则表达式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多