使用正则表达式与p:keyFilter

3

我有一个带有p:keyFilterp:inputMask,用于匹配HH:mm格式的时间,如下所示:

<p:inputMask mask="99:99" ...>
     <p:keyFilter regEx="([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]"/>
</p:inputMask>

但它并不起作用,并且接受从00:0099:99的所有值。我该如何解决?

尝试使用 regEx="/([01]?[0-9]|2[0-3]):[0-5][0-9]/" - Wiktor Stribiżew
如果你使用 <p:keyFilter regEx="/([01]?[0-9]|2[0-3]):[0-5][0-9]/" /> 会怎么样? - Wiktor Stribiżew
@WiktorStribiżew 我遇到了这个错误: '<p:keyFilter>标签库支持命名空间:http://primefaces.org/ui,但未定义名称为keyFilter的标签'。 - Renaud is Not Bill Gates
尝试移除 mask="99:99"。它可能会覆盖正则表达式检查。并使用 <pe:keyFilter regEx="/([01]?[0-9]|2[0-3]):[0-5][0-9]/" /> - Wiktor Stribiżew
@WiktorStribiżew 我已经这样做了,我甚至使用了inputText而不是inputMask,但不幸的是它不起作用。 - Renaud is Not Bill Gates
显示剩余2条评论
1个回答

13

p:keyFilterf:validateRegex——regExinputRegEx

p:keyFilter使用regEx属性来过滤字符(在每个按键时),它不允许您验证表达式(对于完整输入的值)。如果要验证输入是否与正则表达式匹配,请使用inputRegEx属性或f:validateRegex

因此,在您的情况下,您可以使用:

<p:inputXxx ...>
    <f:validateRegex pattern="([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]"/>
</p:inputXxx>
请注意,p:keyFilter 需要 JavaScript 正则表达式,而 f:validateRegex 需要 Java 正则表达式。并且,p:keyFilter inputRegEx 在按键抬起时进行检查,而 f:validateRegex 在字段处理时执行。正确使用 p:keyFilter 的方法如下:
<p:inputXxx ...>
    <p:keyFilter inputRegEx="/[0-9:]/"/>
</p:inputXxx>

但这仍然允许无效输入。

所以,总之:

属性 p:keyFilter inputRegEx="..." f:validateRegex pattern="..."
正则表达式类型 JavaScript Java
执行时机 触发键盘弹起JavaScript事件 处理组件

所有文本输入组件(例如p:inputText)都适用,因此不仅适用于您正在使用的p:inputMask)。

另请参见:

在PrimeFaces 6之前

请注意,p:keyFilter自6.0以来可用。 对于旧版本,您需要使用PrimeFaces Extensions的pe:keyFilter。 请注意,6.0之前的PFE版本与PF版本不对齐。

完全不同的选择

您可以简单地使用p:datePicker,现在它可以用于仅输入时间(小时和分钟):

<p:datePicker pattern="HH:mm" .../>

或者您可以查看pe:timePicker


谢谢,这很有用,但我真的想过滤用户输入以匹配我的正则表达式。 - Renaud is Not Bill Gates
是的,我想防止用户输入与正则表达式不匹配的任何内容,除非他输入与之匹配的内容。 - Renaud is Not Bill Gates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接