为什么你没有得到预期的结果......
你得到一个包含整个文件名的单项数组的原因是你的模式匹配整个文件名,并且匹配一次。
它正在捕获两个组,但rematch返回匹配数组,而不是捕获组的数组,因此您看不到这些组。
如何解决问题...
如果您正在处理简单文件(即没有.htaccess
或类似),那么最简单的解决方案就是使用...
ListLast( filename , '.' )
....仅获取文件扩展名并获取不带扩展名的名称,您可以这样做...
rematch( '.+(?=\.[^.]+$)' , filename )
这使用前瞻来确保在字符串的末尾.
至少有一个非.
,但是(因为它是前瞻)它被排除在匹配之外(所以你只能在匹配中获得预扩展部分) .
要处理非扩展文件(例如.htaccess
或README
),您可以修改上面的正则表达式,.+(?=(?:\.[^.]+)?$)
除了使扩展成为可选之外,它基本上做同样的事情。但是,没有一种简单的方法可以为这些更新 ListLast 方法(猜你需要检查len(extension) LT len(filename)-1
或类似的)。
(可选)访问捕获的组...
如果您想获取实际捕获的组,在 CF 中最接近的本地方法是使用refind函数,将第四个参数设置为 true - 但是,这只给您位置和长度 - 要求您使用mid到自己提取它们。
出于这个原因(以及许多其他原因),我为 CF 创建了一个改进的正则表达式实现,称为 cfRegex,它可以让您直接返回组文本(即不要乱用 mid)。
如果你想使用 cfRegex,你可以像这样使用你的原始模式:
RegexMatch( '(.+?)(\.[^.]*$|$)' , filename , 1 , 0 , 'groups' )
或使用命名参数:
RegexMatch( pattern='(.+?)(\.[^.]*$|$)' , text=filename , returntype='groups' )
并且您会返回一个匹配数组,其中每个元素是该匹配的捕获组的数组。
如果你正在做大量的正则表达式工作来处理捕获的组,那么 cfRegex肯定比使用 CF 的 re 方法更好。
如果您只关心获取扩展名和/或排除扩展名的文件名,那么上面的示例就足够了。