在升级旧的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 ')
也许我只是站在这里的浴缸上,但对于我来说,作为一个随意的正则表达用户,这对我来说似乎并不重要......任何提示都会非常感激!
答案 0 :(得分:1)
您的正则表达式btn\s(?<!\.btn)
无法正常工作,因为在 (?<!\.btn)
和匹配的空白字符后,负面的后顾问btn
运行 。考虑一个btn 123
字符串:btn
匹配,然后空间匹配,并且lookbehind返回 true ,因为btn
不等于.btn
要使您的模式发挥作用(在某种程度上),您可以在\s
:btn(?<!\.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
- 一个单词边界。