为什么这个 Regex 在 REFind() 中不起作用?

Why won't this Regex work in REFind()?

我想搜索一个字符串以确保它不包含任何数字或非字母字符。从我之前的问题 中提出了一个 Regex 解决方案,它似乎可以使用在线测试工具工作。但我无法让它以这种格式工作:

<cfif REFindNoCase(".*?\P{IsAlphabetic}.*", FORM.Forename)>
<p>Error, your name contains illegal characters</p>
</cfif>

它只是允许非法字符串通过,而不提取非法字符。所以 myname1977 似乎在没有显示错误消息的情况下通过了。我做错了什么?

ColdFusion 使用的 Reg Exp 引擎不具备 Java 的所有功能。像这样的事情应该为你做:

<cfscript>
input = "विकिपीडि";
writeDump(isValidUsername(input));// YES

input = "विकिपीडि7";
writeDump(isValidUsername(input));// NO

input = "hello";
writeDump(isValidUsername(input));// YES

input = "hel lo";
writeDump(isValidUsername(input));// NO

input = "hello7";
writeDump(isValidUsername(input));// NO


function isValidUsername(input) {
    var pattern = ".*?\P{IsAlphabetic}.*";
    var Matcher = createObject( "java", "java.util.regex.Pattern" )
        .compile( javaCast( "string", pattern ) )
        .matcher( javaCast( "string", input ) );

    return !Matcher.matches();
}
</cfscript>

更新

我在评论中发布了这个,但可能会有用,所以将它添加到答案中,以防感兴趣:

如果您进行简单匹配,那么 Java 中的字符串内置了对 Reg Exp 的支持,因此您应该可以这样做:mystring.matches(".*?\P{IsAlphabetic}.*"); createObject 版本更多 'reliable' 因为 CF 将来可能会改变某些东西而破坏它。