我正在使用JSF。使用验证代码:
<h:inputText id="sender" value="#{contactForm.sender}">
<f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
</h:inputText>
当我键入一个字符串:abc。结果无效。好。 然后我输入:abcd @。我想,那个字符串是无效的,因为该字符串包含@字母。但我没有收到任何消息。这意味着字符串有效。我不明白正则表达式。你能帮忙吗?
答案 0 :(得分:2)
<f:validateRegex>
不是用于客户端,而是用于服务器端。发布<h:messages>
并发送包含此<h:inputText>
的表单,以查看为sender
组件生成错误值的消息。
示例:
<h:form>
Input the data:
<h:inputText id="sender" value="#{contactForm.sender}">
<f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
</h:inputText>
<h:commandButton value="Submit" />
<h:messages />
</h:form>
正如BalusC在评论中所建议的那样,您可以使用ajax为您的输入onkeyup
事件激活验证。
<h:form>
Input the data:
<h:inputText id="sender" value="#{contactForm.sender}">
<f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
<f:ajax event="keyup" render="messageId" />
</h:inputText>
<h:message id="messageId" for="sender" />
</h:form>
此外,正如DavidStarkey发表评论时,您的正则表达式与abcd@
匹配。如果您想在正则表达式中使用点(.
),请在它之前使用反斜杠(\
):
<f:validateRegex pattern="([a-zA-Z_0-9])\.{4,32}" />
更多信息:
答案 1 :(得分:2)
您忘记转义匹配输入字符串
中任何字符的.
元字符
([a-zA-Z_0-9]).{4,32}
// ^
// |
// |
// Notice the dot . this matches any character
因此,正则表达式将匹配以小写,大写字母或下划线_
开头的任何字符串或0
和9
之间的数字,后跟任何重复4到32次的字符,所以这几乎匹配任何东西。
要解决此问题,您必须转义点.
并在第一组中包含类似以下内容的内容, - 当然您可以使用\w
代替{{1}因为它们也是一样的 - :
[a-zA-Z_0-9]
([\w\.]){4,32}
点必须进入组内,或者表达式将匹配任何以与之前相同的字符串,但随后包含4到32个点,而现在它将匹配包含字母字符的任何字符串或数字或点或下划线,长度在4到32个字符之间。