在javascript中查找字符串中的多(2)个元素

在javascript中查找字符串中的多(2)个元素,javascript,string,indexing,element,Javascript,String,Indexing,Element,我想返回findAB(str)中是否存在一个布尔条件 以“A”开头的5个字母长的字符串以“b”结尾 以“b”开头的5个字母长的字符串以“A”结尾 我首先使用.toLowerCase()方法将字符串改为小写,并定义了indexOFa和indexOFb。 我以为只要做a+4的索引就可以证明是真的,但事实上它并没有,也无法找出我做错了什么。 我还知道一些在数组中查找元素的方法,如find()、includes()、map()或filter,但我不确定是否可以使用它,因为它不是数组。如果要搜索以(a和

我想返回findAB(str)中是否存在一个布尔条件

  • 以“A”开头的5个字母长的字符串以“b”结尾
  • 以“b”开头的5个字母长的字符串以“A”结尾
  • 我首先使用
    .toLowerCase()
    方法将字符串改为小写,并定义了
    indexOFa
    indexOFb

    我以为只要做
    a+4
    的索引就可以证明是真的,但事实上它并没有,也无法找出我做错了什么。
    我还知道一些在数组中查找元素的方法,如find()、includes()、map()或filter,但我不确定是否可以使用它,因为它不是数组。

    如果要搜索以(a和b)或(b和a)开头和结尾的5个字符的模式,而不考虑大小写和字符串的任何长度,可以这样做。 正则表达式认为字符串“a b”或“b a”在任何情况下都只能有字母,不能有任何其他字符,如果您接受任何其他字符,则可以更新正则表达式中的[a-zA-Z]部分

    function findAB(str) {
      const regexp = /(.?(((a|A)[a-zA-Z]{3}(b|B))|((b|B)[a-zA-Z]{3}(a|A))).?)/;
      return regexp.test(str);
    }
    
    如果字符串的长度固定为5,并且只处理第一个和最后一个字符,则可以简单地使用以下函数

    function findAB(str) {
      const lengthOfString = str.length;
      
      if (lengthOfString === 5) {
        const firstCharacter = str[0].toLowerCase()
        const lastCharacter = str[lengthOfString-1].toLowerCase()
        
        return (firstCharacter === 'a' && lastCharacter === 'b') || (firstCharacter === 'b' && lastCharacter === 'a');
      }
      
      // returns false string does not contains 5 characters
      return false;
    }
    

    如果你想改变你的方法,你可以像这样使用正则表达式

    function findAB(str) {
    
      let case1 = str.match(/a[a-z]*b/g); // get all substrings starting with a and ending with b
      let case2 = str.match(/b[a-z]*a/g); // get all substrings starting with b and ending with a
    
      case1.forEach((matchedString) => {
        if (matchedString.length == 5) {
          return true;
        }
      });
    
      case2.forEach((matchedString) => {
        if (matchedString.length == 5) {
          return true;
        }
      });
    
      return false; // return false if no substrings matching condition exists
    }
    
    
    function findAB(str) {
      let lowerSTR = str.toLowerCase();
      let indexOFa = lowerSTR.indexOf('a');
      let indexOFb = lowerSTR.indexOf('b');
    
      if (
        (indexOFa === 0 && indexOFb === str.length - 1) ||
        (indexOFb === 0 && indexOFa === str.length - 1)
      )
        return true;
      return false;
    }
    

    如果您需要区分触发的案例,这可能是一个更干净的解决方案。

    纠正您的解决方案。

    您的解决方案的问题是,如果未找到匹配项,
    indexOf
    将返回
    -1
    。因此
    findAB(“bbbbb”)
    将返回
    true
    ,因为
    indexOFa
    变量将等于
    -1
    ,而
    lowerSTR[indexOFa+4]
    将检查最后一个字符,条件将评估为
    true
    。下面的代码将解决您的问题

    function findAB(str) {
    
      let lowerSTR = str.toLowerCase()
      let indexOFa = lowerSTR.indexOf('a')
      let indexOFb = lowerSTR.indexOf('b')
    
      if ((indexOFa >= 0 && lowerSTR[indexOFa + 4] === 'b') || (indexOFb >= 0 && lowerSTR[indexOFb + 4] === 'a')) {
        return true;
      } 
        return false;
    
    }
    
    另外,我不喜欢硬编码
    4
    更好地使用
    str.length-1

    你也可以这样做

    function findAB(str) {
    
      let case1 = str.match(/a[a-z]*b/g); // get all substrings starting with a and ending with b
      let case2 = str.match(/b[a-z]*a/g); // get all substrings starting with b and ending with a
    
      case1.forEach((matchedString) => {
        if (matchedString.length == 5) {
          return true;
        }
      });
    
      case2.forEach((matchedString) => {
        if (matchedString.length == 5) {
          return true;
        }
      });
    
      return false; // return false if no substrings matching condition exists
    }
    
    
    function findAB(str) {
      let lowerSTR = str.toLowerCase();
      let indexOFa = lowerSTR.indexOf('a');
      let indexOFb = lowerSTR.indexOf('b');
    
      if (
        (indexOFa === 0 && indexOFb === str.length - 1) ||
        (indexOFb === 0 && indexOFa === str.length - 1)
      )
        return true;
      return false;
    }
    

    在使用works的工具进行此操作时,Regex是您的朋友。也就是说,一个问题是,您没有处理没有任何“a”或“b”的问题<在这种情况下,code>indexOf返回
    -1
    ,例如,“dfsa”将在索引
    -1+4
    处有一个“a”。使用这个正则表达式
    /(.?(((a-zA-a)[a-zA-Z]{3}(b | b)]((b | b)[a-zA-Z]{3}(a |(a | a))/
    /a{3}b/i.test str b>。。。如果有换行符之类的东西,可能需要一个dotall标志或与旧浏览器相关的标志。可能只需要三个符号,使用
    ..
    而不是
    {3}
    甚至可以提高可读性。只是不要说到一点,读者必须开始数点。