首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用正则表达式检查字符串错误中的pangram

使用正则表达式检查字符串错误中的pangram
EN

Stack Overflow用户
提问于 2020-05-11 06:41:44
回答 3查看 981关注 0票数 1

罗伊想提高他在编程竞赛中的打字速度。他的朋友建议他反复键入“飞快的棕色狐狸跳过懒狗”这句话。这句话被称为pangram,因为它包含字母表中的每一个字母。

打了几次这个句子之后,罗伊对它感到厌烦,于是他开始寻找其他的穿山甲。

给出一个句子,判断它是否是一只潘格拉姆。别管案子了。

如果输入字符串是pangram,则应该返回字符串pangram。否则,它应该返回,而不是pangram。

样本输入

我们迅速评审了古董象牙扣作为下一个奖项。

// pangram

我们迅速评审了古董象牙扣作为奖品。

//不是pangram (缺少字母x)

代码语言:javascript
运行
复制
function pangrams(s) {

   const exp = /[a-z]/gi; 

   if (s.includes(exp)) {
     return 'pangram';
   } else {
     return 'not pangram';
   } 
   
}

TypeError: String.prototype.includes的第一个参数不能是正则表达式

问题

如果我正在正确地解决这个问题,那么我如何在仍然能够使用正则表达式的情况下解决这个问题呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-11 06:45:35

你的正则表达式错了。它将只检查字符串是否包含从az的一个字母。您也没有正确地测试它-- String.prototype.includes检查子字符串是否包含在较大的字符串中,而不是用于正则表达式验证。

如果要测试正则表达式是否与字符串匹配,请使用.test。要检查所有字母是否都存在于带有正则表达式的字符串中,您必须对每个字符重复(?=.*a),例如:

代码语言:javascript
运行
复制
const pattern = /^(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?=.*e)...../i;
return s.test(pattern);

但这是非常丑陋和重复的。

我不认为正则表达式是这里的方法。考虑对字符代码进行迭代,从A到Z获得字符,然后使用.includes

代码语言:javascript
运行
复制
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'));

如果必须使用正则表达式,则可以通过遍历所有字符代码动态地构造它:

代码语言:javascript
运行
复制
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'));

票数 2
EN

Stack Overflow用户

发布于 2020-05-11 06:55:17

[a-z]符号检查任何单个字母表字符-在您的情况下,您可以首先使用lowerCase删除大小写大小,然后添加一个字母字符regex以匹配所有唯一字符,然后从其中生成一个Set以删除重复字符,最后检查长度是否为26

代码语言:javascript
运行
复制
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"));

上述代码也可以浓缩如下:

代码语言:javascript
运行
复制
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"));

票数 2
EN

Stack Overflow用户

发布于 2020-05-11 06:52:51

我不会在这里使用regex,因为它可能不是最优的解决方案。相反,考虑将输入字符串转换为字母映射,然后断言存在26个键:

代码语言:javascript
运行
复制
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个键,这意味着它包含字母表中的所有字母。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61723699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档