我有一个要求,即带字符串的输入字段只能有这些格式中的一种,使用javascript或jsf验证器实现此目的的最佳方法是什么:
N / A-N-N-N或N / A-N-N-N-N
上面的图案中可以有任何字母代替A.上面的图案中可以有任何数字代替N而不是0.
答案 0 :(得分:3)
首先,没有“最佳”方式。只有“正确”的方式取决于具体的功能要求。
在JSF中验证的常规方法是使用standard validators available via <f:validateXxx>
tags中的一个,或者如果标准标记中没有所需的功能,则使用create a class which implements the Validator interface。另一种方法是按照自己的建议通过JavaScript进行验证,但这完全会使robustness of server-side validation失败,因为JavaScript代码完全由最终用户控制,因此最终用户可以编辑/欺骗/解除。
在您的特定情况下,您希望验证输入是否与常规模式匹配。在这种情况下,<f:validateRegex>
因此是作业的正确标记。
对于实际的常规模式,1到9之间的任何数字都在由[1-9]
表示的正则表达式中,A和Z之间的任何字母字符都在由[A-Z]
表示的正则表达式中(区分大小写!如果您打算允许小写,使用[a-zA-Z]
)。任何“零或一次出现”就像最后一个数字一样是由(...)?
表示的正则表达式,其中...
将被实际模式替换。其余的,字符/
和-
可以按原样表示,只要它们在正则表达式中不是特殊字符,例如.
,(
等,否则它们需要使用\
进行转义。
所以,总而言之,这应该做到:
<h:inputText>
<f:validateRegex pattern="[1-9]/[A-Z]-[1-9]-[1-9]-[1-9](-[1-9])?" />
</h:inputText>
答案 1 :(得分:1)
如果您允许输入大写或小写字符,请使用以下表达式。
<h:inputText>
<f:validateRegex pattern="[1-9]/[a-zA-Z](-[1-9]){3,4}" />
</h:inputText>
答案 2 :(得分:-1)
<h:inputText>
<f:validateRegex pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})" />
</h:inputText>
从这种模式来看,只有当它在6到20的范围内且至少有一个数字,一个大写字母,一个小写字母和一个特殊符号(“@#$%”)