多行正则表达式中的ruby字符串替换

多行正则表达式中的ruby字符串替换,ruby,regex,Ruby,Regex,我试图在跨越多行的ruby正则表达式中使用sting替换。我认为问题在于,在模式中,“#”被视为注释 首先,有没有更好的方法分解长正则表达式?其次,我应该如何在自由间距正则表达式中执行替换 下面的代码有两个示例。get_module_name_a和正则表达式都在一行上,可以很好地工作,get_module_name_b和自由间距正则表达式,替换结果被视为注释(我认为) 理想情况下,我希望我的线路长度保持在80个字符以下 代码的输出当前为 $ ruby test.rb testmod2 test

我试图在跨越多行的ruby正则表达式中使用sting替换。我认为问题在于,在模式中,“#”被视为注释

首先,有没有更好的方法分解长正则表达式?其次,我应该如何在自由间距正则表达式中执行替换

下面的代码有两个示例。get_module_name_a和正则表达式都在一行上,可以很好地工作,get_module_name_b和自由间距正则表达式,替换结果被视为注释(我认为)

理想情况下,我希望我的线路长度保持在80个字符以下

代码的输出当前为

$ ruby test.rb 
testmod2
test.rb:42:in `get_module_name_b': undefined method `[]' for nil:NilClass (NoMethodError)
    from test.rb:46:in `<main>'

这里要提到几件事:

  • 应在
    /x
    regex中的字符类
    []
    中放入一个文本空格(此处为
    mod
    之后的空格)
  • 在B方法中,您将
    $
    \Z
    放在一起
  • 注意量词,将它们放在应用的模式旁边
  • 正则表达式中的
    \A
    强制在字符串开头匹配,而第一个正则表达式没有该限制
以下是工作代码:

def get_module_name_b(repo_name)
  input_string = loadFile
  regex = /mod[ ]["'](\w*)["'],\s*$\n+
    (\s*):git\s*=>\s*["'].*#{repo_name}.git["'],$\n+
    (\s*):ref\s*=>\s*['"](\w+|\w+\.\d+\.\d+)['"]
    $/x
  result = regex.match(input_string)
  result[1]
end

如果将
(\w+(?:\。\d+\。\d+)
正则表达式部分更改为
(\w+(?:\。\d+\。\d+))
Regexp.new(“ab{cd',Regexp::EXTENDED”)
将匹配
abcd

所以你可以用

regex = Regex.new <<-REGEXP, Regexp::EXTENDED
  \A
  mod ["'](\w*)["'],\s*$\n
  +(\s*):git\s*=>\s*["'].*#{repo_name}.git["'],$\n
  +(\s*):ref\s*=>\s*['"](\w+|\w+\.\d+\.\d+)['"]$
  \Z
REGEXP

regex=regex.new您提出的两个问题其实并不相关,只是它们都是关于正则表达式的。您在哪里搜索过有关从简单正则表达式构建复杂正则表达式的信息?源代码遍布互联网,展示了如何做到这一点,加上它是作为您正在使用的Ruby的一部分安装的。在磁盘上搜索rfc2396_parser.rb,它是URI的一部分,并读取该文件。它充满了有趣的例子。
regex = Regex.new <<-REGEXP, Regexp::EXTENDED
  \A
  mod ["'](\w*)["'],\s*$\n
  +(\s*):git\s*=>\s*["'].*#{repo_name}.git["'],$\n
  +(\s*):ref\s*=>\s*['"](\w+|\w+\.\d+\.\d+)['"]$
  \Z
REGEXP