JavaScript:如何使用 REGEX 减少 IF

JavaScript: How to reduce IFs with REGEX

我正在处理以下函数,我必须添加一些 IF,以防字符串比 REGEX 组期望的格式短:

function getFormatedCPF(unformatedValue) {
    const onlyDigits = unformatedValue.toString().replace(/[^\d]/g, "").substring(0, 11);

    if (onlyDigits.length > 9) return onlyDigits.replace(/(\d{3})(\d{3})(\d{3})/, "..-");
    if (onlyDigits.length > 6) return onlyDigits.replace(/(\d{3})(\d{3})/, "..");
    if (onlyDigits.length > 3) return onlyDigits.replace(/(\d{3})/, ".");

    return onlyDigits;
}

有没有办法删除 IF 并仅使用 Regex 获得相同的输出? 我正在寻找类似的东西: 完成:999.999.999-99 部分:999.999.9 因为这个函数会在这个人打字的时候被调用。

您可以使用

const rx = /^(\d{3})(\d{1,3})?(\d{1,3})?(\d{1,2})?.*/;

$('body').on('input', '.val', function(e) {
  this.value = this.value.replace(/\D+/g,'')
    .replace(rx, (_,w,x,y,z) =>
      z ? `${w}.${x}.${y}-${z}` :
      y ? `${w}.${x}.${y}` :
      x ? `${w}.${x}` : w);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="val" />

请注意,^(\d{3})(\d{1,3})?(\d{1,3})?(\d{1,2})?.* 正则表达式匹配并将所有三个数字捕获到组 1 中(否则,添加 . 没有任何意义),然后将一个、两个或三个数字捕获到一个可选组中2(必须有一个数字,否则不需要插入分隔符),第 3 组也是如此,只有一个或两个数字被捕获到第 4 组中。末尾的 .*匹配剩下的任何东西 trim 它关闭。

替换是在箭头函数中完成的,其中替换文本是根据匹配与否动态构建的。