当正则表达式组不为 null 或为空时插入连字符



我有一个数字代码,长度从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

它有两个交替。

  1. ^(d{3})[ -]?()匹配行首,然后捕获第一组三位数字($ 1),然后可以选择后跟空格或连字符。最后,它捕获了一个空组(2 美元)。
  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 上看到它。

最新更新