gpt4 book ai didi

regex - 为什么将文件名与扩展名分开的正则表达式在 ColdFusion 中不起作用?

转载 作者:行者123 更新时间:2023-12-02 06:20:27 25 4
gpt4 key购买 nike

我试图在 ColdFusion 中检索没有扩展名的文件名。我正在使用以下功能:REMatchNoCase( "(.+?)(\.[^.]*$|$)", "Doe, John 8.15.2012.docx");

我希望它返回一个数组,如:["Doe, John 8.15.2012","docx"]但我总是得到一个包含一个元素的数组 - 整个文件名:["Doe, John 8.15.2012.docx"]

我在 rexv.org 上尝试了上面的正则表达式字符串,它按预期工作,但在 ColdFusion 上却不行。我从这个 SO 问题中得到了字符串:Regex: Get Filename Without Extension in One Shot?

ColdFusion 是否使用不同的语法?还是我做错了什么?

谢谢。

最佳答案

为什么你没有得到预期的结果......

您获得包含整个文件名的单项数组的原因是因为您的模式匹配整个文件名,并且匹配一次。

正在捕获两个组,但是rematch返回匹配数组,而不是捕获组的数组,因此您看不到这些组。

如何解决问题...

如果您处理的是简单文件(即没有 .htaccess 或类似文件),那么最简单的解决方案就是使用...

ListLast( filename , '.' )

....要仅获取文件扩展名并获取不带扩展名的名称,您可以...

rematch( '.+(?=\.[^.]+$)' , filename )

这使用前瞻来确保在字符串末尾有一个 . 后跟至少一个非 .,但是(因为它是前瞻)它被排除在比赛之外(因此您只能在比赛中获得预扩展部分)。

要处理非扩展文件(例如 .htaccessREADME),您可以将上面的正则表达式修改为 .+(?=(?:\.[^.]+)?$) 除了使扩展名可选之外,它基本上做同样的事情。但是,没有一种简单的方法可以为这些更新 ListLast 方法(猜测您需要检查 len(extension) LT len(filename)-1 或类似的)。

(可选) 访问捕获的组...

如果您想获取实际捕获的组,在 CF 中最接近的 native 方法是使用 refind函数,第四个参数设置为 true - 然而,这只会给你位置和长度 - 要求你使用 mid自己提取它们。

出于这个原因(以及许多其他原因),我创建了一个 improved regex implementation for CF, called cfRegex ,这让您可以直接返回组文本(即不要乱用 mid)。

如果你想使用 cfRegex,你可以像这样使用你的原始模式:

RegexMatch( '(.+?)(\.[^.]*$|$)' , filename , 1 , 0 , 'groups' )

或者使用命名参数:

RegexMatch( pattern='(.+?)(\.[^.]*$|$)' , text=filename , returntype='groups' )

然后您将返回一个匹配数组,每个元素中的每个元素都是该匹配的捕获组的数组。

如果您正在处理捕获组的大量正则表达式工作,cfRegex绝对比使用 CF 的 re 方法更好。

如果您只关心获取扩展名和/或排除扩展名的文件名,那么上面前面的示例就足够了。

关于regex - 为什么将文件名与扩展名分开的正则表达式在 ColdFusion 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com