为什么这个正则表达式在REFind()中工作?

时间:2015-07-16 14:11:20

标签: regex coldfusion coldfusion-10 coldfusion-11

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

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

它只允许非法字符串通过,而不会接收非法字符。所以myname1977似乎没有显示错误消息。我做错了什么?

1 个答案:

答案 0 :(得分:4)

使用Reg Exp引擎ColdFusion并不具备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}.*");由于CF可能会改变某些内容,因此createObject版本更“可靠”打破它的未来。