我有一个包含任意数量"\n"
的字符串。我需要知道字符串中是否有一行与某个模式不匹配。如果所有行都匹配模式,则返回值应为true
。如果不是,则返回值应为false
。模式是:单词,冒号和数字(/[\w]+\:[\d]+/
)。代码应该是ruby。
这些示例由用户在网页上的textarea框中输入。 输入内容的示例是:
something:1
other:2
more:3
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
最简单/优雅/有效的方式是什么?
答案 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)
!!
强制回答布尔值true
或false
。
您可以对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