9

我正在尝试编写一个正则表达式来测试 PANGRAM。我可以用传统的方式来做,但似乎无法用正则表达式解决超过 90% 的测试。

输入:字符串

输出:真|| 错误的

function isPangram(string){ 
   return ___________________.test(string) 
}

到目前为止的测试结果。

6/10 /([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z, \s]+)/i

6/10 /[a-z]{1}/i

6/10/[a-z]/i

6/10/[a-z]+/i

9/10/a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z/i 只失败了abcdefghijklmopqrstuvwxyz

6/10/[\w.]+/

非常感谢任何帮助或建议。

4

8 回答 8

26
  1. 将字符串转换为小写
  2. 使用正则表达式从字符串中提取所有唯一字母
  3. 检查唯一字母的数量是否为 26

代码:

function isPangram(string) {
    var regex = /([a-z])(?!.*\1)/g;
    return (string.match(regex) || []).length === 26;
}

正则表达式101

var regex = /([a-z])(?!.*\1)/g;

function check() {
  var val = document.getElementById('text').value.toLowerCase();

  alert(val.match(regex).length == 26);
}
<input type="text" id="text" />

<button onclick="check()">Check</button>

于 2015-09-14T04:41:13.127 回答
11

这将是挑战的正确答案:

function isPangram(string){ 
   return /(?=.*a)(?=.*b)(?=.*c)(?=.*d)(?=.*e)(?=.*f)(?=.*g)(?=.*h)(?=.*i)(?=.*j)(?=.*k)(?=.*l)(?=.*m)(?=.*n)(?=.*o)(?=.*p)(?=.*q)(?=.*r)(?=.*s)(?=.*t)(?=.*u)(?=.*v)(?=.*w)(?=.*x)(?=.*y)(?=.*z)./i.test(string) 
}

它对每个字母使用前瞻来检查它们是否在传递的字符串中的某个位置。

于 2015-09-14T04:55:09.053 回答
8

如果您正在寻找非正则表达式解决方案

const isPangram = (string) => 
     new Set(string.toLowerCase().match(/[a-z]/g)).size === 26;

console.log(isPangram("abcdefghijklmnopqrstuvwxyz"));  //true
console.log(isPangram("The Quick Brown Fox Jumps over the lazy dog")); //true

于 2018-08-07T12:33:35.560 回答
2

作为单个正则表达式:

/(?:(?=(.*?([a-z]))(?!.*\2))\1){26}/i

在regex101测试它。

细分:

/
  (?:               // non-capturing group
    (?=             // look-ahead assertion

      (.*?([a-z]))  // match a letter, preceded by as few characters as possible
      (?!.*\2)      // assert that this letter does not appear in the remainder of the string
                    // (in aggregate, this will find the last occurrence of each letter)

    )\1             // actually match that group (this is done to prevent backtracking)
  ){26}             // match 26 times (once for each letter)
/i                  // match case-insensitively

如果您使用的正则表达式引擎支持原子分组(例如 PCRE),则可以更简洁地编写:

/(?>.*?([a-z])(?!.*\1)){26}/i

正则表达式101

于 2020-12-21T18:36:53.107 回答
2

给定一个字符串,检测它是否是一个 pangram。如果是则返回 True ,否则返回 False。忽略数字和标点符号。[根据@Tushar 提供的正则表达式代码添加不区分大小写]

//Detect Pangram
function isPangram(string){
// character set capturing group with negative lookahead
  let regex = /([a-z])(?!.*\1)/gi;
  return (string.match(regex)).length === 26;
}

console.log(isPangram("The quick brown fox jumps over the lazy dog."));// true
console.log(isPangram("This is not a pangram."));// false
console.log(isPangram("Pack my box with five dozen liquor jugs."));// true
console.log(isPangram("This isn't a pangram!"));// false
console.log(isPangram("Detect Pangram"));// false
console.log(isPangram("How quickly daft jumping zebras vex."));// true

于 2021-03-31T10:58:32.257 回答
1

使用 for..of 循环 & 包括:

function isPangram(sentence) {
let lowerCased = sentence.toLowerCase();
for (let char of 'abcdefghijklmnopqrstuvwxyz') {
    if (!lowerCased.includes(char)) {
        return false;
     }
  }
 return true;
}
于 2021-07-11T14:20:00.860 回答
0
function isPangram(input) {
  if(input.length < 26) {
    return false;
  }
  const letters = 'abcdefghijklmnopqrstuvwxyz';
  return Array.from(new Set(input.toLowerCase().split('').filter(i => i.trim()))).sort().join('') === letters;  
}

console.log(isPangram("The String is abcdefghijklumnopqrstvwxyz")); //true
于 2021-04-14T10:25:54.670 回答
-3
function isPangram(string){

  let lc = string.toLowerCase()
 let alphabet = "abcdefghijklmnopqrstuvwxyz"

   return alphabet.split("").filter(c => lc.indexOf(c) === -1).length === 0;
}
  1. 小写字符串
  2. 用字母创建一个字符串
  3. 拆分字母表
  4. 将 filter() 与一个 mini 函数一起使用,该函数将验证其中是否有 0 个错误语句(过滤它,以便在过滤器方法创建的新数组中有 0 个(零)错误语句 (-1) “.lengeth === 0" 确保没有虚假陈述)
于 2020-12-08T01:34:30.087 回答