【发布时间】:2013-10-10 06:15:12
【问题描述】:
我有一个要求,其中接受字符串的输入字段只能具有这些格式中的一种,使用 javascript 或 jsf 验证器实现这一点的最佳方法是什么:
N/A-N-N-N 或 N/A-N-N-N-N
上面的模式中可以有任何字母代替A。上面的模式中可以有任何数字代替0以外的N。
【问题讨论】:
标签: string validation jsf
我有一个要求,其中接受字符串的输入字段只能具有这些格式中的一种,使用 javascript 或 jsf 验证器实现这一点的最佳方法是什么:
N/A-N-N-N 或 N/A-N-N-N-N
上面的模式中可以有任何字母代替A。上面的模式中可以有任何数字代替0以外的N。
【问题讨论】:
标签: string validation jsf
<h:inputText>
<f:validateRegex pattern="((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20})" />
</h:inputText>
从这个模式中,只有在 6 到 20 的范围内且至少有一个数字、一个大写字母、一个小写字母和一个特殊符号(“@#$%”)时才被接受
【讨论】:
如果您允许输入大写或小写字符,请使用以下表达式。
<h:inputText>
<f:validateRegex pattern="[1-9]/[a-zA-Z](-[1-9]){3,4}" />
</h:inputText>
【讨论】:
首先,没有“最好”的方法。只有“正确”的方式取决于具体的功能要求。
在 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>
【讨论】: