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:删除字符串中括号之间的文本[重复]