node下实现多行输入 不用提前输入行数

Posted wangj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node下实现多行输入 不用提前输入行数相关的知识,希望对你有一定的参考价值。

实现方案:line事件中暂存输入行,利用debounce防抖,当暂定输入一段时间后将暂存的进行批量处理

以一道机试题为例
描述
密码要求:
1.长度超过8位
2.包括大小写字母.数字.其它符号,以上四种至少三种
3.不能有相同长度大于2的子串重复
输入描述:
一组或多组长度超过2的字符串。每组占一行
输出描述:
如果符合要求输出:OK,否则输出NG

示例1
输入:
021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
复制
输出:
OK
NG
NG
OK

const readline = require(\'readline\');

function isRepeatStr(str){
    let len = str.length - 2;
    for(let i = 0; i<len;i++){
        let subStr = str.substring(i,i+3);
        let tmpStr1 = str.substring(0,i);
        let tmpStr2 = str.substring(i+3);
        if(tmpStr1.indexOf(subStr) > 0)
            return true;
        if(tmpStr2.indexOf(subStr) > 0)
            return true;
    }
    return false;
}

function strWeight(str){
    let numWeight = 0;
    let upperWeight = 0;
    let lowerWeight = 0;
    let otherWeight = 0;
    str.split(\'\').forEach(item=>{
        if(isNum(item)){
            numWeight = numWeight?numWeight:1;
        }
        else if(isUpperChar(item)){
            upperWeight = upperWeight?upperWeight:1;
        }
        else if(isLowerChar(item)){
            lowerWeight = lowerWeight?lowerWeight:1;
        }
        else
            otherWeight = otherWeight?otherWeight:1;
    })
    return numWeight+upperWeight+lowerWeight+otherWeight;
}

function isNum(str){
    return str.match(/[0-9]/) != null;
}

function isUpperChar(str){
    return str.match(/[A-Z]/) != null;
}

function isLowerChar(str){
    return str.match(/[a-z]/) != null;
}

function debounce(func, delay) {
    var timer;
    return function() {
      var context = this;
      clearTimeout(timer);
      timer = setTimeout(function() {
        func.apply(context, arguments);
        timer = undefined;
      }, delay || 20);
    };
};

function myProcess(str)
{   
    return (strWeight(str) >= 3) && (!isRepeatStr(str)) && (str.length > 8);
}

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
let globalArray=[];
function processAll(){
    globalArray.forEach(line=>{
        if(myProcess(line) == true) {
            console.log(\'OK\');
        } else {
            console.log(\'NG\');
        }
    })
}
let delayProcess = debounce(processAll,20);
rl.on(\'line\', function (line) {
    
    globalArray.push(line);
    
    delayProcess();
});

以上是关于node下实现多行输入 不用提前输入行数的主要内容,如果未能解决你的问题,请参考以下文章

Java多行输入,行数未知

文本域,支持多行文本输入

iPhone:如何在不考虑宽度的情况下获取textView中输入的行数

VIM中的复制剪切移动多行删除

sqlplus多行代码怎么

百度Echarts地图上呈现的数据如何直接从Mysql数据库获取,且显示多行数据,而不用手动在html文件中输入?