JavaScript:如何使用 REGEX 减少 IF

Posted

技术标签:

【中文标题】JavaScript:如何使用 REGEX 减少 IF【英文标题】:JavaScript: How to reduce IFs with REGEX 【发布时间】: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(/(\d3)(\d3)(\d3)/, "$1.$2.$3-");
    if (onlyDigits.length > 6) return onlyDigits.replace(/(\d3)(\d3)/, "$1.$2.");
    if (onlyDigits.length > 3) return onlyDigits.replace(/(\d3)/, "$1.");

    return onlyDigits;

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

【问题讨论】:

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

你可以使用

const rx = /^(\d3)(\d1,3)?(\d1,3)?(\d1,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" />

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

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

【讨论】:

太棒了,我需要一段时间才能理解它......:P......但这是乐趣的一部分。感谢您的快速回复

以上是关于JavaScript:如何使用 REGEX 减少 IF的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Regex:如何将变量放入正则表达式中? [复制]

减少链接 URL 重定向 [IIS/Regex/ReWrite]

使用正则表达式(regex)替换jQuery / JavaScript中的选定文本

JavaScript / regex:删除字符串中括号之间的文本[重复]

如何使用 javascript 在 regExp 中使用动态变量? [复制]

Javascript 的奇怪 RegEx 请求