JavaScript замена регулярного выражения не соответствует в коде, но соответствует в редакторе - PullRequest
0 голосов
/ 21 января 2020

Я пытаюсь заменить вхождения текста в документах на некрасивое, но нормально работающее регулярное выражение (проверено на regex101 и в редакторе, оно соответствует). Но когда я запускаю код, он не работает.

Regex101: https://regex101.com/r/rGmYpP/1

Мой код:

(async () => {
    const rename = util.promisify(fs.rename);
    const files = await fs.readdir('./working');
    for (let i = 0; i < files.length; i++) {
        const file = files[i];
        const read = async (filePath) => {
            const str = fs.createReadStream(filePath, 'utf8')
                .pipe(new stream.Transform({
                    decodeStrings : false,
                    transform(chunk, encoding, done) {
                        let result = chunk.replace(/\(LAST.*\n.*\n.*\n.*UPDATE/gm, '--------------');
                        done(null, result);
                    }
                }));
            const tempPath = await tempWrite(str);
            await rename(tempPath, filePath+'-output');
        };
        await read('./working/'+file);
    }
})();

Пример текста:

OESHNF+Arial*1 [12 0 0 -12 0 0 ]msf
321.639 19.075 mo
(LAST )
[6.672 8.00409 8.00409 7.33191 0 ]xsh
354.938 19.075 mo
(UPDATE )
[8.664 8.00409 8.664 8.00409 7.33191 8.00409 0 ]xsh
406.945 19.075 mo
(OF )

Ожидаемый результат:

OESHNF+Arial*1 [12 0 0 -12 0 0 ]msf
321.639 19.075 mo
-------------- )
[8.664 8.00409 8.664 8.00409 7.33191 8.00409 0 ]xsh
406.945 19.075 mo
(OF )

Спасибо за помощь, надеюсь, я все предоставил.

Ответы [ 2 ]

1 голос
/ 21 января 2020

Использование \(LAST[^]+?UPDATE.

Где [^]+? означает 1 или более любых символов (включая символы новой строки), не жадные.

1 голос
/ 21 января 2020

Я создал такой пример:

#!/bin/env node

const fs = require('fs');
const stream = require('stream');

(async () => {
  const file = "test-file.txt";
  const read = async (filePath) => {
      const str = fs.createReadStream(filePath, 'utf8')
          .pipe(new stream.Transform({
              decodeStrings : false,
              transform(chunk, encoding, done) {
                  console.log("chunk", chunk);
                  let result = chunk.replace(/\(LAST.*\n.*\n.*\n.*UPDATE/gm, '--------------');
                  console.log("result", result);
                  done(null, result);
              }
          }));
  };
  await read(file);
})()

И "test-file.txt", например:

OESHNF+Arial*1 [12 0 0 -12 0 0 ]msf
321.639 19.075 mo
(LAST )
[6.672 8.00409 8.00409 7.33191 0 ]xsh
354.938 19.075 mo
(UPDATE )
[8.664 8.00409 8.664 8.00409 7.33191 8.00409 0 ]xsh
406.945 19.075 mo
(OF )

Регулярное выражение работает, если файл использует LF (0x0A) в качестве ограничителя строки, но не в том случае, если файл использует CR + LF (0x0D + 0x0A) в качестве ограничителя строки.

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