题干:判断一个全是小写字母的字符串是否符合如下规则
- 1.至少包含一个元音字母;
- 2.不能有三个连续的字母都是元音字母;
- 3.不能有三个连续的字母都是辅音字母;
- 4.不能有两个连续的字母是一样的,但是 e 字母和 o 字母除外。
说明:
元音字母为:a,e,i,o,u,其他都为辅音字母
方法一:
function isMatching(str) {
if (typeof str !== 'string') {
console.error("请传入字符串")
return false
}
if (!isVowel(str)) {
console.log("第1条不匹配")
return false
}
if (!rulesTwo(str)) {
console.log("第2或3条不匹配")
return false
}
if (!rulesThree(str)) {
console.log("第4条不匹配")
return false
}
return true
}
/**
* @description 是否包含元音
*/
function isVowel(str) {
return str.includes('a')
|| str.includes('e')
|| str.includes('i')
|| str.includes('o')
|| str.includes('u')
}
function rulesTwo(str) {
const arr = str.split("");
for (let i = 0, length = arr.length; i < length - 2; i++) {
let n = 0, m = 0;
function fn(value) {
if (isVowel(arr[value])) {
n++;
} else {
m++
}
}
fn(i)
fn(i + 1)
fn(i + 2)
// console.log(n)
// console.log(m)
if (n === 0 || m === 0) {
return false
}
}
return true
}
function rulesThree(str) {
const arr = str.split("");
for (let i = 0, length = arr.length; i < length - 1; i++) {
function isEqual(a, b) {
if (a === b && a !== 'e' && a !== 'o') {
return true
}
return false
}
if (isEqual(arr[i], arr[i + 1])) {
return false
}
}
return true
}
const res = isMatching("aecdeefooff");
console.log("res=" + res)
方法二:正则
//至少包含一个元首字母
const class1 = new RegExp('[aeiou]', 'ig')
//(不能)有三个连续的字母都是元音字母
const class2 = new RegExp('[aeiou][aeiou][aeiou]',' ig')
//(不能)有三个连续的字母都是辅音字母
const class3 = new RegExp('[^aeiou][^aeiou][^aeiou]','ig')
//(不能)有两个连续的字母是一样的,但是e字母和o字母除外
const class4 = new RegExp('[^ao])\\1','ig')
const test(value)=> {
var msg = []
msg.push(class1.test(value)?'':'至少包含一个元音字母')
msg.push(!class2.test(value)?'':'不能连续三个元音字母')
msg.push(!class3.test(value)?'':'不能连续三个辅音字母')
msg.push(!class4.test(value)?'':'不能有两个连续的字母是一样的,但是e字母和o字母除外')
msg = msg.filter(a =>a);
return {
value, msg, resolve: !msg.length}
}
console.log(JSON.stringify(test('aq' )))
console.log(JSON.stringify(test('aaq')))
console.log(JSON.stringify(test('qqq')))
console.log(JSON.stringify(test('aaa')))