罗伊想提高他在编程竞赛中的打字速度。他的朋友建议他反复键入“飞快的棕色狐狸跳过懒狗”这句话。这句话被称为pangram,因为它包含字母表中的每一个字母。
打了几次这个句子之后,罗伊对它感到厌烦,于是他开始寻找其他的穿山甲。
给出一个句子,判断它是否是一只潘格拉姆。别管案子了。
如果输入字符串是pangram,则应该返回字符串pangram。否则,它应该返回,而不是pangram。
样本输入
我们迅速评审了古董象牙扣作为下一个奖项。
// pangram
我们迅速评审了古董象牙扣作为奖品。
//不是pangram (缺少字母x)
码
function pangrams(s) {
const exp = /[a-z]/gi;
if (s.includes(exp)) {
return 'pangram';
} else {
return 'not pangram';
}
}
TypeError: String.prototype.includes的第一个参数不能是正则表达式
问题
如果我正在正确地解决这个问题,那么我如何在仍然能够使用正则表达式的情况下解决这个问题呢?
发布于 2020-05-11 06:45:35
你的正则表达式错了。它将只检查字符串是否包含从a
到z
的一个字母。您也没有正确地测试它-- String.prototype.includes
检查子字符串是否包含在较大的字符串中,而不是用于正则表达式验证。
如果要测试正则表达式是否与字符串匹配,请使用.test
。要检查所有字母是否都存在于带有正则表达式的字符串中,您必须对每个字符重复(?=.*a)
,例如:
const pattern = /^(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?=.*e)...../i;
return s.test(pattern);
但这是非常丑陋和重复的。
我不认为正则表达式是这里的方法。考虑对字符代码进行迭代,从A到Z获得字符,然后使用.includes
:
const test = (str) => {
const strUpper = str.toUpperCase();
// start at A
for (let i = 65; i <= 90; i++) {
if (!strUpper.includes(String.fromCharCode(i))) {
return false;
}
}
return true;
};
console.log(test('The quick brown fox jumps over the lazy dog'));
console.log(test('The quick brown fox jumps over the lazy do'));
如果必须使用正则表达式,则可以通过遍历所有字符代码动态地构造它:
const test = (str) => {
const pattern = new RegExp(
'^' +
Array.from(
{ length: 26 },
(_, i) => `(?=.*${String.fromCharCode(i + 65)})`
).join(''),
'i'
);
return pattern.test(str);
};
console.log(test('The quick brown fox jumps over the lazy dog'));
console.log(test('The quick brown fox jumps over the lazy do'));
发布于 2020-05-11 06:55:17
[a-z]
符号检查任何单个字母表字符-在您的情况下,您可以首先使用lowerCase
删除大小写大小,然后添加一个字母字符regex以匹配所有唯一字符,然后从其中生成一个Set
以删除重复字符,最后检查长度是否为26
。
const pangram = s => {
const lower = s.toLowerCase();
const letters = lower.match(/[a-z]/gi);
const uniques = new Set(letters);
if (uniques.size == 26) return "Pangram";
else return "Not pangram";
};
console.log(pangram("The quick brown fox jumps over the lazy dog"));
console.log(pangram("Not a pangram lol"));
上述代码也可以浓缩如下:
const pangram = s => new Set(s.toLowerCase().match(/[a-z]/gi)).size == 26 ? "Pangram" : "Not pangram";
console.log(pangram("The quick brown fox jumps over the lazy dog"));
console.log(pangram("Not a pangram lol"));
发布于 2020-05-11 06:52:51
我不会在这里使用regex,因为它可能不是最优的解决方案。相反,考虑将输入字符串转换为字母映射,然后断言存在26个键:
var letters = {};
var input = "The quick brown fox jumps over the lazy dog";
input = input.replace(/[^A-Za-z]+/g, "");
for (var i=0; i < input.length; i++) {
letters[input.charAt(i).toLowerCase()] = 1;
}
if (Object.keys(letters).length == 26)
console.log("PANGRAM");
else
console.log("NOT A PANGRAM");
这里的方法首先删除所有非alpha字符。然后,它构建一个映射,其中每个键都是输入中出现的任何字母的小写版本。匹配的pangram有26个键,这意味着它包含字母表中的所有字母。
https://stackoverflow.com/questions/61723699
复制相似问题