Regex 如果“不”与“不”匹配,则使用“厨师插入线”:&引用;

Regex 如果“不”与“不”匹配,则使用“厨师插入线”:&引用;,regex,ruby,chef-infra,Regex,Ruby,Chef Infra,我必须如何更改我的正则表达式,以便在每次调用代码时不会将行重写到文件中 line_text = 'Everything is ok\:ok check /test/user/*' ruby_block "update file" do block do fe = Chef::Util::FileEdit.new("/home/user/test") fe.insert_line_if_no_match(/#{line_text}/, l

我必须如何更改我的正则表达式,以便在每次调用代码时不会将行重写到文件中

line_text = 'Everything is ok\:ok check /test/user/*'
ruby_block "update file" do
  block do
    fe = Chef::Util::FileEdit.new("/home/user/test")
    fe.insert_line_if_no_match(/#{line_text}/, line_text)
    fe.write_file
  end
end

我认为“\:”是一个问题,因为行每次都被重写。

反斜杠字符在正则表达式中是“特殊”的,因为它转义了下面的字符,因此下一个字符将被视为正常字符。结尾的星号也很特别,因为它表示前一个字符出现0次或更多次

你在那里建立你的正则表达式而没有处理这些案例。在此之后,原始字符串中的反斜杠字符将被正则表达式匹配忽略,星号字符可能会导致稍微不正确的匹配(同样,不考虑源字符串中的文字星号)

要解决此问题,您可以在构建正则表达式时使用以下方法对
line\u text
变量进行转义:

line_text = 'Everything is ok\:ok check /test/user/*'
ruby_block "update file" do
  block do
    fe = Chef::Util::FileEdit.new("/home/user/test")
    fe.insert_line_if_no_match(/#{Regexp.escape(line_text)}/, line_text)
    fe.write_file
  end
end