我有一个数字代码,长度从6-11位不等
每 3 位数字后用连字符分隔
可能的组合
123-456
123-456-78
123-456-7890
因此,在这里,我尝试将用户输入的代码转换为这种格式,即使输入中间带有空格和连字符。
例如:
123 456-7 -> 123-456-7
123456 789 -> 123-456-789
123456 -> 123-456
有效的用户输入格式为 3 位数字[空格或连字符]3 位数字[空格或连字符]0 到 5 位数字
我试过这样
code.replace(/^(d{3})[- ]?(d{3})[- ]?(d{0,5})$/,'$1-$2-$3');
但是当只有 6 位数字时,数字末尾有一个不需要的连字符 (-)。
123-456-
有人可以帮助我吗?谢谢。
最简单的方法可能是用第二个replace
来做到这一点:
code.replace(/^(d{3})[- ]?(d{3})[- ]?(d{0,4})$/,'$1-$2-$3')
.replace(/-$/, '');
这是链接第二个替换函数,该函数显示"用空字符串替换字符串末尾的-
"。或者换句话说,"如果字符串的最后一个字符是-
则删除它。
我发现这种方法比尝试将此逻辑全部放入replace
命令中更直观,但这也是可能的:
code.replace(
/^(d{3})[- ]?(d{3})[- ]?(d{0,4})$/,
'$1-$2' + ($3 == null ? '' : '-') + $3
)
我认为我做的这段代码一目了然不太明显,但最终结果是相同的。如果没有匹配$3
(即您的刺痛仅包含 6 位数字),则不要在替换中包含最后的-
。
我相信这会为你做 - 替换
^(d{3})[ -]?()|(d{3})[ -]?(d{1,5})
跟
$1$3-$2$4
它有两个交替。
^(d{3})[ -]?()
匹配行首,然后捕获第一组三位数字($ 1),然后可以选择后跟空格或连字符。最后,它捕获了一个空组(2 美元)。(d{3})[ -]?(d{1,5})
匹配并捕获($ 3),三位数字,可以选择后跟空格或连字符。然后,它会匹配并捕获(($4))剩余的 1-5 位数字(如果存在)。
由于设置了全局标志,它将为每个数字序列进行一次或两次迭代。第一个将匹配第一个交替,将前三个数字捕获到第 1 组中。组 2 将为空。
对于第二次迭代,第一个匹配项与前三个数字匹配,因此这次第二次交替将匹配并将接下来的三个数字捕获到第 3 组中,然后将剩余的数字捕获到第 4 组中。
注意!如果在第一次匹配后只剩下三位数字,则任何交替都不会匹配,最后三位数字保持不变。
因此,在第一次迭代中,组 1 是数字 123。组 2、3 和 4 为空。第二个迭代组 1 和 2 为空,组 3 是数字 456,组 4 是数字 7-11。
这给出了第一个替换 $1 =123-
加什么都没有,第二个456-67...
.
不过,这里没有语法检查。它假设数字已按照您所说的方式输入。
在 regex101 上看到它。