【问题标题】:Javascript Pangram RegexJavascript Pangram 正则表达式
【发布时间】:2015-09-14 04:26:16
【问题描述】:

我正在尝试编写一个正则表达式来测试 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.]+/

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

【问题讨论】:

  • 如果测试可以给 ser 吗?
  • 所以您尝试仅使用正则表达式来测试 Pangram。??这会很难。
  • 您只需要 something 代替 ___________________ 或其他方法对您有用(如下面我的回答)?
  • 谢谢大家,如果您有兴趣运行它,下面的 zerkms 答案通过了所有 20 次测试。

标签: javascript regex pangram


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

代码:

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

Regex101

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>

【讨论】:

  • 检查问题 - 它提供了函数的模板。所以不能放任意js,答案只能是正则表达式。
  • 从技术上讲,它仍然不符合要求。挑战要求您仅替换 _______ 部分而不修改其他任何内容。
  • 这是一个很棒的方法,并且还通过了另一轮测试。但它没有通过:'AbCdEfGhIjKlM zYxWvUtSrQpOn' 或'多快愚蠢的跳跃斑马烦恼'。棘手
  • @Vontei 这两个字符串都是 PANGRAMS,当给上面的演示输入输入时,它显示为 true,它按预期工作。不是吗?
  • @PraveenKumar 它没有回答提出的问题:-D
【解决方案2】:

这将是挑战的正确答案:

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) 
}

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

【讨论】:

    【解决方案3】:

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

    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

    【讨论】:

      【解决方案4】:

      作为单个正则表达式:

      /(?:(?=(.*?([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
      

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

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

      regex101.

      【讨论】:

        【解决方案5】:

        给定一个字符串,检测它是否是一个 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

        【讨论】:

          【解决方案6】:

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

          function isPangram(sentence) {
          let lowerCased = sentence.toLowerCase();
          for (let char of 'abcdefghijklmnopqrstuvwxyz') {
              if (!lowerCased.includes(char)) {
                  return false;
               }
            }
           return true;
          }
          

          【讨论】:

            【解决方案7】:
            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
            

            【讨论】:

              【解决方案8】:
              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" 确保没有虚假陈述 )

              【讨论】:

              • OP 询问的是使用 RegEx(正则表达式),而不是一般如何解决这个问题。
              • 是的,但是我在我的上面看到了一个非正则表达式解决方案,我认为在这个意义上给他一个不同的解决方案会很有用。不过还是谢谢你!
              猜你喜欢
              • 2012-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多