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

use*_*540 0 regex coldfusion caching

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

所以我决定编写将采用文件路径的函数,/css/style.css并返回/css/style.2342342.css2342342是unix时间戳的地方.

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

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

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

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

dun*_*can 5

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

"有些人在面对问题时会想"我知道,我会使用正则表达式."现在他们有两个问题."

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

<cfset newFileName = listFirst(fileName, '.') & '.' & mtime & '.' & listLast(filename, '.')>
Run Code Online (Sandbox Code Playgroud)

  • +1为好的解决方案和良好的报价...顺便说一句[你觉得[引用似乎不完整](http://www.rexegg.com/regex-humor.html#twoprobs)?:) (4认同)

Pet*_*ton 5

在{\\.([^./]+)$}你发现的是不是一个功能正则表达式- ,只要{和}不使用这样的正则表达式.有些语言可能会将它们用作正则表达式的分隔符,但在实际的正则表达式中,它们用于量词,(例如x{3,5},x和5之间的匹配).

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

正则表达式解决方案:

rereplace( filename , '(?=\.[^./]+$)' , '.' & mtime )
Run Code Online (Sandbox Code Playgroud)

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

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

非正则表达式解决方案:

Left(filename,filename.lastIndexOf('.')+1) & mtime & '.' & ListLast(filename,'.')
Run Code Online (Sandbox Code Playgroud)

可能更有效(但不一定是显着水平).

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