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 它关闭。
替换是在箭头函数中完成的,其中替换文本是根据匹配与否动态构建的。
我正在处理以下函数,我必须添加一些 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 它关闭。
替换是在箭头函数中完成的,其中替换文本是根据匹配与否动态构建的。