我遇到了这个[[a-ce-gi-mo-su-y] /)正则表达式,以解决Coderbyte上的问题。我不明白的是为什么/ [a-z] /实现相同目标时要使用该表达式。另外,为什么要单独使用/ [zdhnt] /。感谢您的时间。
完整代码:
function LetterChanges(str) {
str = str.trim().toLowerCase();
var len = str.length;
var newStr = '';
for (var i = 0; i < len; i++) {
if (/[a-ce-gi-mo-su-y]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 97)
}
else if (/[zdhnt]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 65);
}
else {
newStr += str[i];
}
}
return newStr;
}
答案 0 :(得分:1)
/[a-ce-gi-mo-su-y]/
与/[a-z]/
不同。前者包含5个字符范围:a-c, e-g, i-m, o-s, u-y
。它与字母d, h, n, t, z
不匹配。
在元音d, h, n, t, z
之前的字母e, i, o, u, a
;在您提到的问题中应该用不同的方式处理(替换后,将元音更改为大写)。
答案 1 :(得分:1)
该函数显然要根据输入字符生成一个包含小写字母和大写字母的字符串。当它们是dhntz
之一时,输出产生一个大写字母(从ASCII代码65开始),对于所有其他字母,它产生一个小写字母(从ASCII代码97开始)。非字母保持不变。
如果交换了if
条件,则它可能已使用[a-z]
。像这样:
if (/[zdhnt]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 65);
}
else if (/[a-z]/.test(str[i])) {
newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 97)
}
但是,编码人员选择了另一种方法,并首先测试不是那些特殊字符的字母。因此,它是范围的串联,等效于更长的时间:
/[a-c]|[e-g]|[i-m]|[o-s]|[u-y]/
很遗憾,该代码在使用String.fromCharCode
表达式时具有一定的代码重复性。
可以像这样实现相同的目的
function LetterChanges(str) {
return str.trim().toLowerCase().replace(/([zdhnt])|[a-z]/g, (m, toCapital) =>
String.fromCharCode(((m.charCodeAt(0) - 18) % 26) + (toCapital ? 65 : 97))
);
}
console.log(LetterChanges("abcdefghijk"));
此处replace
方法与回调参数一起使用。匹配的字符将是m
参数,如果匹配项在捕获组(([zdhnt])
)中,则toCaptital
也将是相同的值-否则为空。三元表达式负责其余的工作。
答案 2 :(得分:0)
查看此站点:https://regex101.com/tests 它提供了对RegEx表达式的分析-以及许多其他功能,例如添加单元测试来测试/演示RegEx以确保其正常工作。
网站为您的问题提供了以下说明:
[a-ce-gi-mo-su-y]
a-c a single character in the range between a (index 97) and c (index 99) (case sensitive)
e-g a single character in the range between e (index 101) and g (index 103) (case sensitive)
i-m a single character in the range between i (index 105) and m (index 109) (case sensitive)
o-s a single character in the range between o (index 111) and s (index 115) (case sensitive)
u-y a single character in the range between u (index 117) and y (index 121) (case sensitive)
我已经在这个网站上使用了很多RegEx表达式-希望它可以帮助您...