为什么这个 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 将来可能会改变某些东西而破坏它。
我想搜索一个字符串以确保它不包含任何数字或非字母字符。从我之前的问题
<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 将来可能会改变某些东西而破坏它。