【问题标题】:Regex multiline match正则表达式多行匹配
【发布时间】:2014-08-21 10:25:47
【问题描述】:

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

这些示例由用户在网页的文本区域框中输入。 输入内容的例子有:

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

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

最简单/优雅/高效的方法是什么?

【问题讨论】:

  • something:1 有效还是无效?
  • 我不明白...您的字符串是否包含换行符\n 或转义换行符\\n?如果您执行.inspect,它将如何打印?
  • 您只需要检查格式还是正在处理/转换字符串?
  • 更新了示例。 user3218114:有效。 arco444:再次添加示例,由于某种原因,用户“sawa”移动了它... Stefan:我想检查格式 -> 用户输入必须与正则表达式匹配
  • 致编辑问题并删除一半问题的用户“sawa”:如果您想清理它,那很好。只是不要删除说明情况的示例,就像 arco444 所问的那样......

标签: ruby regex string match multiline


【解决方案1】:

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

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

【讨论】:

  • 一个非常好的亚军,它使正则表达式在逐行的基础上更加简单。太棒了!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多