正则表达式允许在编辑时使用零长度字符串

时间:2015-06-10 21:00:16

标签: regex

所以我正在尝试创建一个正则表达式,允许用户更改由冒号分隔的三个数字。我目前正在使用以下正则表达式:

"\\b([1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0)\\:([1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0)\\:([1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0)\\b"

它在很大程度上起作用并防止任何字符串无效,但编辑单个数字时会出现问题。以401:53:3为例,如果我将光标放在整个字符串的远端,我可以保留退格并删除整个内容。然后我可以输入一个有效值并保存(如果它无效,它将不允许我保留它。)

当我尝试编辑其中一个数字时,问题就出现了。因此,如果我将光标放在401末尾的1块中,然后按住退格键,则会删除最后两个数字,但不会删除4。对于想要更改第一个号码但不想重写整个号码的用户来说,这可能很麻烦。

这有意义吗?无论如何,我可以在正则表达式部分中允许零长度字符串吗?

1 个答案:

答案 0 :(得分:0)

发布我的建议,因为它证明了你的工作。

我建议即使在用户删除字符串中的整个数字子部分时也允许匹配字符串。 \b在字边界处匹配,因此不允许我们匹配\b:,这就是为什么我建议在非字边界处添加与\B匹配的替代方法。

我们需要为所有数字部分添加它,以便它们可以变为"可选"。

(\b(?:[1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0)|\B):([1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0|\B):((?:[1-9][0-9]?[0-9]?[0-9]?|[1-5][0-9][0-9][0-9][0-9]|6[0-4][0-9][0-9][0-9]|65[0-4][0-9][0-9]|655[[0-2][0-9]|6553[0-5]|0)\b|\B)
                                                                                                                             ^                                                                                                                         ^                                                                                                                               ^

请参阅demo

请注意,此正则表达式仅适用于实时验证。我相信,最终验证可以使用您的初始正则表达式执行。