【问题标题】:Trimming input from stdin修剪来自标准输入的输入
【发布时间】:2019-02-19 14:38:06
【问题描述】:

有时我想要的字符串与我不想要的字符串配对,例如如果我愿意

*AA*

有时它会以

的形式出现
*AA* *AA* F EE*AA*F EE *AA* *AA*

而且我不想要“F EE”部分。这是我的代码,但它不起作用,我仍然得到上面的完整字符串。任何想法为什么?

process.stdin.resume();
var seq = [];
var count = 1; 
process.stdin.on("data", function(data) { 
     (/\*AA\*/).exec(data);
     (/\*BB\*/).exec(data);
     (/\*CC\*/).exec(data);
     (/\*DD\*/).exec(data);
seq.push(data.toString('utf8')); 
   if (seq.length === count) {
      for (var i=0; i<seq.length; i++) { console.log(seq[i]); }
      seq = [];
      count++;
   }
});

【问题讨论】:

  • 我注意到的第一件事是:javascript Regex 例如您的(/\*AA\*/).exec(data) 不修改 目标——该语句与模式的数据并返回匹配项。您没有将该返回值分配给任何东西,因此执行 (/\*AA\*/).exec(data) 对任何东西都没有(外部)影响。
  • 嗯,好的。那我该如何返回值呢?

标签: javascript arrays node.js sorting


【解决方案1】:

match 适合这类问题。只需给正则表达式 g 标签并使通配符非贪婪(?

let str = "*AA* *BB* F EE*AA*F EE *CC* *AA*"

let seq = str.match(/\*.*?\*/g)
console.log(seq)

然而,不清楚的一点是您如何在on data 处理程序中处理部分输入。例如,如果您收到字符串的一部分,例如 F EE*A 在一个事件中,另一部分 A*F EE 在下一个事件中,正则表达式将不匹配 *AA* - 您需要等到确定您拥有整个输入。

【讨论】:

  • 试过了,它回来了 let seq = data.match(/*.*?*/g) TypeError: data.match is not a function 当我把它变成一个函数时,我得到了另一个错误.push(data.toString('utf8')); TypeError:无法读取 null 的属性“推送”
  • 如果你 console.log(data) 你会得到什么?
【解决方案2】:

您的实际代码没有返回任何内容,因为 .exec() 调用没有分配给任何变量并且它们没有做任何事情。

另一件事你可以用一个 regex 替换所有这些正则表达式:

/\*(AA|BB|CC|DD)\*/g

并将它与 String#match() method 一起使用,这将返回匹配的 array

这应该是你的代码:

process.stdin.on("data", function(data) {
  seq = data.match(/\*(AA|BB|CC|DD)\*/g);
  console.log(seq);
});

演示:

这是一个示例工作演示:

var str = "*AA* *BB* F EE*AA*F EE *CC* *AA*"

var seq = str.match(/\*(AA|BB|CC|DD)\*/g);
console.log(seq);

【讨论】:

    【解决方案3】:

    我注意到的第一件事是:像 (/\*AA\*/).exec(data) 这样的 JavaScript 正则表达式不会修改目标——该语句将数据与模式匹配并返回匹配项。您没有将该返回值分配给任何东西,因此执行 (/\*AA\*/).exec(data) 对任何东西都没有(外部)影响。

    var found = (/\*AA\*/).exec(data) 将获得匹配的部分,但这仍然不会修改data 的内容。如果您正在查找所有匹配项,而忽略不匹配的文本,则可以从数据中提取匹配项,而无需对其进行修改。

    从一个正则表达式变量开始——因为重复使用.exec(s) 会继续匹配它离开的地方。像 /\*AA\*/ 这样的文字正则表达式无法做到这一点。
    在这里,我正在结合你的表达,并打开g“全局匹配”选项:

    let re = /\*(AA|BB|CC|DD)\*/g;
    

    然后只要找到匹配项就循环:

    let re = /\*(AA|BB|CC|DD)\*/g;
    let matches = [];
    var m;
    
    do {
        m = re.exec(data);
        if (m) {
            // m.index can tell you where in `data` the match
            // was found, if you care.
            console.log('matched: ' + m[0]);
            // push the match into our array, to be used later.
            matches.push(m[0]);
        }
    } while (m);
    
    // now do something with the matches
    

    【讨论】:

    • 实际上\*[ABCD]{2}\*会匹配*AB*, *AC*, ...以及这4个字符的任意组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多