【发布时间】:2017-06-26 18:20:11
【问题描述】:
一般问题
如果该模式之前已匹配 N 次,您如何防止正则表达式匹配?
具体例子
我有一个 13 位的记录标识符,用户将在文本字段中键入,例如“123-456-7891011”。
我试图封装的行为是在键入时在第 4 位和第 7 位数字之前添加一个破折号。我拥有处理事件的所有 javascript,没有任何问题。
它将始终是数字 - 我在此特定步骤之前处理它。
当我每次输入第 n+4 位数字时,我能够很好地降低正则表达式以插入破折号。我需要的是它在第二个“-”之后的任何时候都不要这样做
到目前为止,我的事件处理程序 (oninput) 中最接近的是:
var addDash = /([^\-\d{3}]*\d{3})(\d+)/;
this.value = this.value.replace(addDash, "$1-$2");
例如,输入“1234567891011”会得到“123-456-789-101-1”,而我想要的是“123-456-7891011”。
可能有其他方法来处理这种情况(例如split 和join),但出于这个问题的目的,让我们坚持使用正确的正则表达式模式来回答,如果这样的模式是可能的。还发生了其他一些事情,使这种模式非常有用 - 我只是没有运气弄清楚它。
为清楚起见,此模式将在文本字段上运行 oninput - 匹配应适用于 1 到 13 之间的任何字符长度:
"123456" -> "123-456"
"123456789" -> "123-456-789"
"1234567891011" -> 123-456-7891011"
【问题讨论】:
-
@anubhava 仅适用于全长模式,而不适用于所有情况。为了清楚起见,我更新了 OP
-
您的意思是任何长度的文本 1 - 15。您是在处理 onkeypres,还是在每个键盘输入上,甚至是退格键或箭头键?你在处理 paste 吗?
-
你的正则表达式没有做你认为它已经做的事情。
[^-\d{3}]*表示 0 个或多个不是连字符、数字、左大括号、数字 3 或右大括号的字符。所以排除所有有效字符,所以它总是匹配零个字符。 -
For example, typing "1234567891011"在1234567之前得到123...? -
如果您对每个键输入的文本框进行重写,除非它是复合的(即双缓冲),否则它将看起来很生涩。最好仅在发生更改时处理/重写。换句话说,让盒子处理添加,然后在删除时重写。或附加
-。保持最后一张当前图像进行比较。
标签: javascript regex