正则表达式:匹配btn但不匹配.btn

时间:2018-01-10 16:44:36

标签: ruby regex haml

在升级旧的bootstrap版本的过程中,我无法想出正确的正则表达式来处理我的类在HAML代码中编写的各种方式。

以下是我的代码中.btn类出现的一些示例:

%a.btn.btn-primary

= f.submit "Save", class: "btn btn-primary"

在迁移Ruby脚本中,我可以通过以下行很容易地修复第一个版本(haml_string是包含我的行的变量):

haml_string.gsub(/(.*)\.btn\s(.*)/, '\1.btn .btn-default \2')

但我正在努力修复第二个版本,特别是因为第一个版本已经运行。我尝试过以下内容(负面展望,看看我们是否与上一次运行中已修复的.btn版本相匹配:

haml_string.gsub(/btn\s(?<!\.btn)/, 'btn btn-default ')

也许我只是站在这里的浴缸上,但对于我来说,作为一个随意的正则表达用户,这对我来说似乎并不重要......任何提示都会非常感激!

1 个答案:

答案 0 :(得分:1)

您的正则表达式btn\s(?<!\.btn)无法正常工作,因为在 (?<!\.btn) 匹配的空白字符后,负面的后顾问btn运行 。考虑一个btn 123字符串:btn匹配,然后空间匹配,并且lookbehind返回 true ,因为btn 不等于.btn

要使您的模式发挥作用(在某种程度上),您可以在\sbtn(?<!\.btn)\s之前移动lookbehind。在这种情况下,匹配btn后,正则表达式引擎会确保当前位置左侧没有.btn

但是,您的模式看起来好像要将btn作为整个单词进行匹配。 因此,我建议通过以下方式修复模式(参见demo):

/\bbtn\b(?<!\.btn)/

或者,使它更短(已经是mentioned by @ctwheels):

/(?<!\.)\bbtn\b/

this regex demo。请注意,此版本效率更高,因为只有在btn之前没有出现时才会匹配.(它不会检查字边界和btn出现在不匹配的上下文)。

如果您想了解有关定位背光的详细信息,请参阅the "Positioning the Lookaround" section at rexegg.com

模式详情

  • (?<!\.) - 如果.出现在当前位置的左侧,则会导致匹配失败的负面背后隐藏
  • \b - 字边界
  • btn - btn
  • \b - 一个单词边界。