仅允许在 HTML / Javascript 中使用正则表达式和字符串替换输入 1-12 和 00-59

Only allow 1-12 and 00-59 input in HTML / Javascript with regex and string replace

为了遵循 12 小时时间格式,我尝试替换两个输入字段中的文本,一个只允许输入 1-12 的数字,另一个只允许输入 00-59 的数字。到目前为止,当输入事件中不包含正则表达式模式时,我一直在使用 javascript 字符串替换。

我一直在尝试以下正则表达式的不同负前瞻变体(如果不包含这些值,则替换)但没有成功

<input type="text" oninput="this.value = this.value.replace(/?!(1[0-2]|[1-9])/g, '');" />

正则表达式中的否定断言总是"zero width";也就是说,没有不匹配的字符串的特定部分。

要了解原因,请考虑在分钟字段中输入的字符串“123”;显然,它不匹配模式 /1[0-2]|[1-9]/,但它不匹配的部分是什么?是 3,剩下 12 吗?或者也许是 1,让你 23 岁?或者也许应该删除 2 和 3,只留下 1?

在这种情况下,最好的方法不是做出否定的断言,而是检测您想要保留的部分,捕获它,然后丢弃其他所有内容。例如,如果你匹配 /^.*?(1[0-2]|[1-9])?.*?$/,整个字符串将始终匹配,有效部分(如果存在)将在捕获变量 $1 中;因此您可以用捕获的部分替换整个字符串,有效地删除其余部分(开头和结尾的 .*?)。

一种方法可能是使用 test and match a digit from 1 -12 using ^(?:1[0-2]|[1-9])$

如果值不是 1 - 12,则将其设置为空字符串。

<form id="" name="">
  <input type="text" oninput="if (!/^(?:1[0-2]|[1-9])$/.test(this.value)) { this.value = '' }" />
</form>