在javascript中查找字符串中的多(2)个元素
我想返回findAB(str)中是否存在一个布尔条件在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和
.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}
甚至可以提高可读性。只是不要说到一点,读者必须开始数点。