正则表达式,用于在文件名和扩展名之间插入数值

时间:2014-05-15 08:01:33

标签: regex caching coldfusion

在一篇文章中,我读过如果我们使用JavaScript和CSS文件(如style.css?V=1)传递查询字符串,在某些情况下浏览器不会缓存文件。

所以我决定编写将采用/css/style.css之类的文件路径的函数,并返回/css/style.2342342.css,其中2342342是unix时间戳。

<cfset mtime = 2342342>
<cfset fileName = "/css/style.css">

<cfset newFileName = REReplace(fileName,'{\\.([^./]+)$}',mtime)>
<cfdump var = "#newFileName#">

我从Google搜索中获得了这个'{\\.([^./]+)$}'正则表达式,但它无效。

我对正则表达式并不擅长。请帮忙。

3 个答案:

答案 0 :(得分:5)

您使用正则表达式使事情过于复杂。正如jwz所说

  

&#34;有些人在面对问题时会想到,我知道,我会使用   正则表达式。&#34;现在他们有两个问题。&#34;

使用Coldfusion,您只需将文件名视为带有.分隔符的列表。您希望在该列表的最后一部分之前插入mtime值。假设您的文件名不包含多个.,您可以使用:

<cfset newFileName = listFirst(fileName, '.') & '.' & mtime & '.' & listLast(filename, '.')>

答案 1 :(得分:5)

您找到的{\\.([^./]+)$}不是正常运行的正则表达式 - 只要{}不像正则表达式那样使用。某些语言可能会将这些语言用作正则表达式的分隔符,但在实际的正则表达式中,它们用于量词,(例如x{3,5}匹配x和5中的3)。

此外,\\.正在寻找文字\后跟.作为元字符(这不是意图 - 它应该只是\.)。 (同样,这可能是由于示例来自要求反斜杠转义的任何语言; CF不需要它,因此这样做会干扰正则表达式行为。)

正则表达式解决方案:

rereplace( filename , '(?=\.[^./]+$)' , '.' & mtime )

这使用预测(?=..)而不是捕获组来简化替换方 - 在最终.之前将替换插入位置而不替换任何实际字符

如果要更换时间戳,可以很容易地将\.\d+添加到开头并使其正常工作。

非正则表达式解决方案:

Left(filename,filename.lastIndexOf('.')+1) & mtime & '.' & ListLast(filename,'.')

可能效率更高(但不一定达到显着水平)。

正则表达式的一个缺点是它们是单向的 - 它们从一开始就开始向前发展。对于长串,当你只关心最后几个字符,这可能意味着浪费时间看你不关心的字符。像lastIndexOfListLast这样的方法从最后开始向后工作,从而避免那些不必要的检查。同样,在这种情况下,字符串足够短,几乎肯定不会重要,但这是值得记住的事情。

答案 2 :(得分:0)

这是一个基于列表的解决方案,可能稍微简单一些 - 并且解决了Peter提到的文件名中多个.的问题。

<cfset mtime = 2342342>
<cfset fileName = "/css/style.css">
<cfset newFileName = listInsertAt( fileName, listLen( filename, '.'), mtime, '.' ) />

您可能需要添加更多逻辑来检查listLen( filename, '.')是否至少为2,但这是一个开始。