JavaScript 实现判断一个全是小写字母的字符串是否符合如下规则

题干:判断一个全是小写字母的字符串是否符合如下规则

  • 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')))

猜你喜欢

转载自blog.csdn.net/weixin_40599109/article/details/115137955