Regex 如何使用正则表达式禁止ColdFusion中的非字母数字字符

Regex 如何使用正则表达式禁止ColdFusion中的非字母数字字符,regex,coldfusion,Regex,Coldfusion,我正在使用ColdFusion 9.0.1 我试图测试用户是否提供了非字母数字值。如果有,我想返回false。我很确定我已经很接近了,但我不断地得到一个错误: Complex object types cannot be converted to simple values. 我已经尝试了多种方法让它工作,但我无法让它工作 具体地说,我只允许a到z和0到9。没有空格或特殊字符 你能帮我调整一下吗 <cfscript> LOCAL.Description =

我正在使用ColdFusion 9.0.1

我试图测试用户是否提供了非字母数字值。如果有,我想返回false。我很确定我已经很接近了,但我不断地得到一个错误:

Complex object types cannot be converted to simple values.
我已经尝试了多种方法让它工作,但我无法让它工作

具体地说,我只允许a到z和0到9。没有空格或特殊字符

你能帮我调整一下吗

    <cfscript>
        LOCAL.Description = trim(left(ARGUMENTS.Description, 15));
        if (len(LOCAL.Description) lte 4) {
            return false;
        } else if (reMatchNoCase("[^A-Za-z0-9_]", LOCAL.Description) neq "") {
            return false;
        } else {
            return true;
    </cfscript>

LOCAL.Description=trim(左(ARGUMENTS.Description,15));
if(len(本地描述)lte 4){
返回false;
}否则,如果(重新命名为“[^A-Za-z0-9”,本地描述)neq“”){
返回false;
}否则{
返回true;
W

reMatchNoCase(“[^A-Za-z0-9\”,本地。说明)neq


这是因为
ReMatchNoCase
返回一个数组,而不是一个简单的字符串。请检查数组长度,或者更好地使用
ReFindNoCase
。它返回第一个匹配的位置,如果找不到,则返回0。

ReMatchNoCase返回无法与字符串进行比较的数组,请使用ArrayLen()查看结果,以确定是否存在匹配项


实际上,代码中还有另一个问题。如果描述的长度小于15,则第一行将产生错误,这意味着第一个if将过时,因为它将始终为false。

您也可以尝试以下方法:

<cfscript>
    local.description = trim(local.description);
    return reFind("(?i)^[A-Z0-9_]{5,}$", local.description)?true:false;
</cfscript>

local.description=修剪(local.description);
return reFind((?i)^[A-Z0-9}{5,}$”,local.description)?true:false;

我参加聚会迟到了,但
reFindNoCase
是2021年的最佳解决方案。以下是我将如何处理原始问题中的代码:

// best practice not to have a local var name identical to an argument var
var myValue = trim( left( arguments.description, 15 ) );

// return false if myValue is less than 4 or has special characters
return(
   !len( myValue ) lte 4 && 
   !reFindNoCase( "[^a-z0-9]", myValue )
);

您发布的错误消息——以及您的问题描述——并不正确。错误与您检查/处理变量有关,就好像它是简单的(字符串、数字等),但事实上,变量是复杂类型(对象、数组、结构等)。但是,您的问题提出了完全不同的问题—什么是正则表达式模式来匹配/禁止字符串中的非字母数字字符(该字符包装在[[:alnum:]]POSIX引用中)。您可能需要返回并重新分析您遇到的问题。如果长度小于15,则不会出错。它应该只返回整个字符串“原样”。感谢您提供的解决方案:否则如果(arrayLen(reMatchNoCase([^A-Za-z0-9_3;]”,LOCAL.Description))eq 0,您可以通过执行以下操作缩短它:
否则如果(!arrayLen(reMatchNoCase)(“[^A-Za-z0-9",LOCAL.Description))
在CF 8中也应该可以使用。我确实记得有一段时间在执行时遇到错误,例如,
left(“x”,2)
-但这可能是CFMX的一个老错误,因为我在最新版本中肯定做过类似的工作,没有任何问题。这听起来有点熟悉。但它在mx6中工作,因此问题可能更为严重。@Evik-Welcome:)因为您似乎没有将结果数组用于任何事情,我认为
ReFind
可以从效率的角度来看,它更有意义。我来试一试。谢谢!你使用三元
?真:假
有冗余,但除此之外,这个解决方案比进行不同的长度和字符匹配更有意义。哦,更简单的正则表达式就是
^\w{5,}$
-那么就不需要
(?I)