0

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

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

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

4

2 回答 2

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 在评论中所建议的那样,您可以使用 ajaxonkeyup为您的输入事件触发验证。

<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}" />

更多信息:

于 2013-08-22T15:16:53.733 回答
2

您忘记转义.与输入字符串中的任何字符匹配的元字符

([a-zA-Z_0-9]).{4,32}
//            ^
//            |
//            |
//        Notice the dot . this matches any character

因此,您的正则表达式将匹配任何以小写、大写字符或下划线_或数字开头的字符串09然后是重复 4 到 32 次的任何字符,因此这几乎匹配任何内容。

要解决此问题,您必须转义点.并包含在第一组中,如下所示- 当然您可以使用它们来\w代替,[a-zA-Z_0-9]因为它们也是相同的 -

([\w\.]){4,32}

点必须进入组内,.否则表达式将匹配任何以与之前相同开头但包含 4 到 32 个点的字符串,而现在它将匹配任何包含字母字符或数字或点或下划线的字符串4 到 32 个字符之间。

于 2013-08-22T15:20:56.153 回答