f:在输入无效字符后,validateRegex不显示任何消息

时间:2013-08-22 15:11:36

标签: regex jsf

我正在使用JSF。使用验证代码:

<h:inputText id="sender" value="#{contactForm.sender}">
      <f:validateRegex pattern="([a-zA-Z_0-9]).{4,32}" />
</h:inputText>

当我键入一个字符串:abc。结果无效。好。 然后我输入:abcd @。我想,那个字符串是无效的,因为该字符串包含@字母。但我没有收到任何消息。这意味着字符串有效。我不明白正则表达式。你能帮忙吗?

2 个答案:

答案 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

因此,正则表达式将匹配以小写,大写字母或下划线_开头的任何字符串或09之间的数字,后跟任何重复4到32次的字符,所以这几乎匹配任何东西。

要解决此问题,您必须转义点.并在第一组中包含类似以下内容的内容, - 当然您可以使用\w代替{{1}因为它们也是一样的 -

[a-zA-Z_0-9]

([\w\.]){4,32} 点必须进入组内,或者表达式将匹配任何以与之前相同的字符串,但随后包含4到32个点,而现在它将匹配包含字母字符的任何字符串或数字或点或下划线,长度在4到32个字符之间。