regex Vaadin 23和客户端正则表达式验证

r8uurelv  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(140)

进入新的Vaadin 23版本后,我发现组合setPattern/setPreventInvalidInput已被setPattern/setAllowedCharPattern取代,但行为不一样。在新的Vaadin版本中,如何防止用户使用正则表达式在客户端输入无效值?我需要用户无法输入对正则表达式无效的数据。
示例:

tf.setPattern("(\\d){0,5}");
tf.setPreventInvalidInput(false);

用户输入的数字不能超过5个,这是预期行为。

tf.setPattern("(\\d){0,5}");
tf.setAllowedCharPattern("\\d");

用户可以输入5个以上的数字,该字段将被设置为无效,但行为与之前不同。
是否有办法使用Vaadin 23/24功能实现与setPreventInvalidInput相同的功能?
此致,

hgqdbh6s

hgqdbh6s1#

这并不一定会取代所有可能的正则表达式的功能,但如果您的目标是防止用户实际键入5个以上的数字,如您的示例所示,则可以保留仅允许数字的这一部分:

tf.setAllowedCharPattern("\\d");

并添加最大长度:

tf.setMaxLength(5);

这样用户就不能在文本字段中输入5个以上的数字,你不会像输入非数字时那样在文本字段中得到很好的抖动效果,但是用户将被禁止输入5个以上的字符(并且由于正则表达式的原因,用户只能输入数字)。
或者,您也可以只使用之前使用的方法,但将setPreventInvalidInput()方法设置为true(在您的示例中为false):

tf.setPattern("\\d{0,5}");
tf.setPreventInvalidInput(true);

尽管setPreventInvalidInput()方法被弃用,但这仍然有效,因此可能是一个值得关注的问题,因为看起来它将在Vaadin的未来版本(可能是24)中被删除。
再多考虑一下这个问题,我怀疑它被弃用的原因是它对输入有不可预测的影响。例如,像“ab”这样的简单正则表达式应该允许“ab”,但不允许任何输入,因为regex模式必须匹配整个字符串,显然你不能只输入一个字符“ab”,所以根本不允许输入任何字符。这个观点得到了this GitHub issue中GitHub相关问题和讨论的评论的支持。

相关问题