Обрезка ввода от стандартного ввода - PullRequest
0 голосов
/ 14 сентября 2018

Иногда строки, которые я хочу, соединяются со строками, которые я не хочу, например, если я хочу

*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++;
   }
});

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Первое, что я заметил, это следующее: регулярное выражение javascript, такое как ваш (/\*AA\*/).exec(data), не изменяет цель - этот оператор сопоставляет данные с шаблоном и возвращает совпадение (я). Вы не присваиваете это возвращаемое значение чему-либо, поэтому выполнение (/\*AA\*/).exec(data) не оказывает (внешнего) влияния ни на что.

var found = (/\*AA\*/).exec(data) получит соответствующую часть, но это все равно не изменит содержимое data. Если вы ищете все совпадения, игнорируя несоответствующий текст, вы можете извлечь совпадения из данных без необходимости их изменения.

Начните с переменной regex - потому что повторное использование .exec(s) продолжает совпадать с того места, где оно было остановлено. Буквальное регулярное выражение вроде вашего /\*AA\*/ не может этого сделать.
Здесь я объединяю ваши выражения и включаю опцию g "global match":

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
0 голосов
/ 14 сентября 2018

Ваш реальный код ничего не возвращает, потому что вызовы .exec() не назначены никаким переменным и они ничего не делают.

Еще одна вещь, которую вы можете просто заменить все эти регулярные выражения одним регулярное выражение :

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

И используйте его вместе с String#match() метод , который вернет 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);
0 голосов
/ 14 сентября 2018

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* - вам нужно будет подождать, пока вы не убедитесь, что у вас естьвесь ввод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...