正则表达式多行匹配

时间:2014-08-21 10:25:48

标签: ruby regex string match multiline

我有一个包含任意数量"\n"的字符串。我需要知道字符串中是否有一行与某个模式不匹配。如果所有行都匹配模式,则返回值应为true。如果不是,则返回值应为false。模式是:单词,冒号和数字(/[\w]+\:[\d]+/)。代码应该是ruby。

这些示例由用户在网页上的textarea框中输入。 输入内容的示例是:

一个有效的例子(所有行都有效):

something:1
other:2    
more:3     

无效示例(第2,3,4行无效 - >只有第1,5行有效):

something:1     
other:stuff      
invalid         
)/&invalid again 
valid_again:4    

这些示例在代码中作为单个字符串接收,行以\n分隔(来自有效示例):

valid_example_string = "something:1\nother:2\nmore:3"

有一种简单的正则表达方式吗?我不是在寻找如何循环线。我正在寻找一种速记正则表达式(如果可能的话)来匹配示例,这是(伪代码)行中的一些东西:

valid_example_string.test(/the_needed_regex/)    # => true
invalid_example_string.test(/the_needed_regex/)  # => false

最简单/优雅/有效的方式是什么?

3 个答案:

答案 0 :(得分:1)

lines会将字符串拆分为多行 如果块为任何元素返回false,则any?将返回false。

regex = /^\w+\:\d+$/ 
example_string.lines.any?{|e| e =~ regex }

答案 1 :(得分:0)

对于整个字符串正则表达式,您可以使用

regex = /\A(\w+:\d+\s*\n?)+\z/

一个简单的解决方案

!!string.match(regex)

!!强制回答布尔值truefalse

完全实现您的伪代码

您可以对String类进行猴子修补,以添加test方法:

class String
   def test(regex)
     !!self.match(regex)
   end
end

输出:

valid_example_string.test(regex)    # => true
invalid_example_string.test(regex)  # => false

答案 2 :(得分:0)

regexp = %r{\A(\w+:\d+\n?)*\z} # or %r{\A(\w+:\d+\n?)+\z} to fail on empty strings
valid_example =~ regexp # => 0
invalid_example =~ regexp # => nil