【问题标题】:JavaScript: How to reduce IFs with REGEXJavaScript:如何使用 REGEX 减少 IF
【发布时间】:2021-11-16 21:03:31
【问题描述】:

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

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})/, "$1.$2.$3-");
    if (onlyDigits.length > 6) return onlyDigits.replace(/(\d{3})(\d{3})/, "$1.$2.");
    if (onlyDigits.length > 3) return onlyDigits.replace(/(\d{3})/, "$1.");

    return onlyDigits;
}

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

【问题讨论】:

  • 那么-后面只能有两位数?
  • 是的。我考虑过允许更多字符,但限制应该有助于打字的人也不会弄错文档

标签: javascript regex regex-group regexp-replace


【解决方案1】:

你可以使用

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 组中。最后的 .* 匹配任何剩下的东西来修剪它关闭。

替换是在箭头函数中完成的,其中替换文本是动态构建的,取决于哪个组匹配或不匹配。

【讨论】:

  • 太棒了,我需要一段时间才能理解它......:P......但这是乐趣的一部分。感谢您的快速回复
猜你喜欢
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 2023-03-09
  • 2018-08-28
相关资源
最近更新 更多