【问题标题】:JS Regex returning -1 & 0JS 正则表达式返回 -1 & 0
【发布时间】:2020-09-21 19:23:55
【问题描述】:

我的任务是:

  1. 取一个字符串

  2. 将每个元音打印在新行上(按顺序)然后...

  3. 在新行上打印每个辅音(按顺序)

我发现的问题与正则表达式有关。我原来用的……

/[aeiouAEIOU\s]/g

但是这将返回 0 和元音和 -1 和辅音(所以一切都发生了相反的事情)。 我真的很难理解为什么,我一生都找不到答案。最后,只需反转字符串就足够简单了,但我想知道为什么会这样。有人可以帮忙吗?

let i;
let vowels = /[^aeiouAEIOU\s]/g;
let array = [];
function vowelsAndConsonants(s) {
    for(i=0;i<s.length;i++){
        //if char is vowel then push to array
        if(s[i].search(vowels)){
           array.push(s[i]);         
        }
        
    }
    for(i=0;i<s.length;i++){
        //if char is cons then push to array
        if(!s[i].search(vowels)){
           array.push(s[i]);         
        }      
    }
    for(i=0;i<s.length;i++){
        console.log(array[i]);    
    }
}

vowelsAndConsonants("javascript");

【问题讨论】:

  • 你想要.test函数,它返回真或假

标签: javascript regex


【解决方案1】:

你用过:

/[^aeiouAEIOU\s]/g

代替:

/[aeiouAEIOU\s]/g

^ 表示“不是”,因此您的正则表达式 /[^aeiouAEIOU\s]/g 计算所有辅音。

【讨论】:

    【解决方案2】:

    有几个可用的内置函数:

    let some_string = 'Mary had a little lamb';
    
    let vowels = [...some_string.match(/[aeiouAEIOU\s]/g)];
    let consonents = [...some_string.match(/[^aeiouAEIOU\s]/g)];
    
    console.log(vowels);
    console.log(consonents);

    【讨论】:

      【解决方案3】:

      我认为您没有正确理解正则表达式的工作原理。在括号中,您只定义了一组要匹配的字符/[^aeiouAEIOU\s]/g,并进一步使用插入符号[^]作为组中的第一个,您说您希望它匹配除插入符号中的字符之外的所有字符。遗憾的是,您没有提供输入和预期输出的示例,所以我只是猜测,但我认为您可以执行以下操作:

      let s = "avndexleops";
      let keep_vowels = s.replace(/[^aeiouAEIOU\s]/g, '');
      console.log(keep_vowels);
      let keep_consonants = s.replace(/[aeiouAEIOU\s]/g, '');
      console.log(keep_consonants);
      

      请提供预期输入和输出的示例。

      【讨论】:

      • 对于预期的输入/输出,比方说:“javascript”“aaijvscrpt” 我提供的完整代码是有效的。但我的期望是“/[aeiouAEIOU\s]/g”如果是元音应该返回 1 / true,如果是其他任何东西,应该返回 0 / false。但实际发生的情况是,如果它是辅音,它将返回 -1,如果它是元音则返回 0:/
      • search() 必须返回 -1,因为搜索返回一个索引,它可以是从 0 到 Infinity 的任何数字。您正在寻找test() 函数
      【解决方案4】:

      if(vowels.test(s[i])){ 如果匹配则返回 true 或 false,或者
      if(s[i].search(vowels) !== -1){if(s[i].search(vowels) === -1){
      如果您想修复代码,这是您想要的。
      -1 不是错误的,因此您的 if 语句将无法正常运行。 -1 是搜索在找不到匹配项时返回的内容。它必须这样做,因为search() 返回匹配的索引位置,并且索引可以是从 0 到 Infinity 的任意位置,因此只有负数可以表示不存在的索引:
      MDN search() reference

      下面是一个匹配元音或任何字母或其他的正则表达式,有效地将元音、辅音和其他所有内容分成 3 个捕获组。这使得您无需逐个字符地测试并手动将它们分开。
      然后使用 for-of 循​​环迭代并将它们推送到各自的数组中。

      const consonants = [], vowels = [], other = [];
      
      const str = ";bat cat set rat. let ut cut mut,";
      
      for(const [,cons,vow,etc] of str.matchAll(/([aeiouAEIOU])|([a-zA-Z])|(.)/g))
        cons&&consonants.push(cons) || vow&&vowels.push(vow) || typeof etc === 'string'&&other.push(etc)
      
      console.log(
      consonants.join('') + '\n' + vowels.join('') + '\n' + other.join('')
      )

      【讨论】:

      • 谢谢!那就是我弄错了。我认为 search() 会返回真或假。感谢您的解释:)
      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多