正则表达式不符合预期

时间:2013-06-09 06:09:00

标签: ruby regex .htaccess templates

我需要编辑模板的区域并生成.htaccess文件。这是.htaccess文件的模板的一部分。 [NPAC_TMP:~core_dir]是被替换的部分:

RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ [NPAC_TMP:~core_dir]/$1
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE

Ruby Script:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s
param        = template_tag.split("~")[1][0..-2]

if(param == "core_dir")
  line[template_tag]= CONFIG[:core_dir]
  temp_file.puts line
end

当脚本运行时,除最后一个脚本外,所有脚本都被正确替换:

RewriteCond %{REQUEST_URI} !^core/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ core/$1
RewriteCond %{HTTP_HOST} ^(www.)?localhost:8888$
RewriteRule ^(/)?$ [NPAC_TMP:~core_dir]/index.php [L] ###DEFECTIVE LINE

这不是此方法运行的唯一模板文件,并且在所有其他文件中,它在所有项目都被替换的情况下正常工作。

出于问题排查目的,我复制了RewriteCond %{REQUEST_URI} !^[NPAC_TMP:~core_dir]/"并将其直接放在缺陷线下方。这个添加的项目已正确更新,但上面的项目仍未正确更新。

然后我在其下方放置了一个缺陷线的副本,并收到了两条有缺陷的线条,这让我相信它的结构就是这个完整的字符串构成了抛出REGEX的方式:{{1} }

非常感谢任何帮助。另外,如果您有关于如何缩短或改进脚本的Ruby部分的建议,我会全力以赴。

2 个答案:

答案 0 :(得分:2)

忘了让小组不贪心:

template_tag = line.match(/\[NPAC_TMP:~(.*)\]/).to_s

应该是:

template_tag = line.match(/\[NPAC_TMP:~(.*?)\]/).to_s

解决了这个问题,现在匹配所有案例。

答案 1 :(得分:1)

你的正则表达式.*中的\[NPAC_TMP:~(.*)\]是贪婪的(它尽可能匹配),所以匹配

[NPAC_TMP:~core_dir]/index.php [L]

给你组

core_dir]/index.php [L

请参阅http://rubular.com/r/NbZxd5prdT

您应该使用[^]]*(或[^]]+代替.*

请参阅http://rubular.com/r/h0YcyWfvgu

下次如果遇到正则表达式问题,最好的方法是打印/删除匹配项,这样就可以看到匹配的内容。

我也总是在rubular中“开发”/编写我的正则表达式,以确保它们按照我的预期运行。