Выполните несколько фильтров регулярных выражений для текстового содержимого в Node.js с помощью Javascript

#javascript #node.js #regex #ascii #non-ascii-characters

#javascript #node.js #регулярное выражение #ascii #символы, отличные от ascii

Вопрос:

У меня есть несколько фильтров регулярных выражений, которые я хочу запустить в текстовом файле внутри узла. Я прочитал файл, затем установил содержимое в качестве переменной, затем я хочу проанализировать содержимое с помощью regex, чтобы удалить все недопустимые символы.

Изначально я пытался использовать один из единственных найденных мной модулей Node, который мог бы это сделать, под названием https://www.npmjs.com/package/clean-text-utils — Однако, похоже, он нацелен на Typescript, и я не смог заставить его работать с Node 8.10. Итак, я покопался в node_module, чтобы найти соответствующий JS, чтобы попытаться заменить недопустимые символы с помощью функции.

Как я могу запустить все фильтры регулярных выражений для переменной myTXT? На данный момент он просто выводит текст с неправильными не-ASCII-апостроф.

 var myTXT;

...

const readFile = util.promisify(fs.readFile);
await readFile('/tmp/'   myfile, 'utf8')
    .then((text) => {
        console.log('Output contents: ', text);
        myTXT = text;
    })
    .catch((err) => {
        console.log('Error', err);
    });

var myTXT = function (myTXT) {
    var s = text
        .replace(/[‘’u2018u2019u201A]/g, ''')
        .replace(/[“”u201Cu201Du201E]/g, '"')
        .replace(/u2026/g, '...')
        .replace(/[u2013u2014]/g, '-');
    return s.trim();
};

console.log('ReplaceSmartChars is', myTXT);
  

Вот пример проблем с апострофами, вызванных копированием текста с веб-страницы и вставкой в текстовый файл, также показанный в PasteBin:

 Resilience is what happens when we’re able to move forward even when things don’t fit together the way we expect.

And tolerances are an engineer’s measurement of how well the parts meet spec. (The word ‘precision’ comes to mind). A 2018 Lexus is better than 1968 Camaro because every single part in the car fits together dramatically better. The tolerances are more narrow now.
  

https://pastebin.com/uJ7GAKk4

Скопировано со следующего URL, вставлено в блокнот и сохранено

https://seths.blog/storyoftheweek/

Комментарии:

1. Не могли бы вы предоставить пример, в котором указаны неправильные апострофы, пожалуйста?

2. Привет, Влаз, я добавил это сейчас. Спасибо

Ответ №1:

На данный момент вы не вызываете свою функцию, которая выполняет замену, вместо этого вы перезаписываете функцию своим текстом.

 const readFile = util.promisify(fs.readFile);

function replaceChars(text) {
   return text
        .replace(/[‘’u2018u2019u201A]/g, ''')
        .replace(/[“”u201Cu201Du201E]/g, '"')
        .replace(/u2026/g, '...')
        .replace(/[u2013u2014]/g, '-')
        .trim();
}

const myTXT = await readFile('/tmp/'   myfile, 'utf8')
    .then((text) => {
        console.log('Output contents: ', text);
        return replaceChars(text);
    })
    .catch((err) => {
        console.log('Error', err);
    });

console.log('ReplaceSmartChars is', myTXT);
  

Комментарии:

1. Вы ожидаете на верхнем уровне — если это не относится к асинхронной функции, которая не будет работать.

2. Ах, только что увидел, что в вопросе также было ожидание. Это просто выглядит неправильно, когда явно не объявлено в асинхронной функции.

3. Извините, забыл упомянуть. Это выполняется в рамках лямбда-функции, которая использует асинхронность exports.handler = async (event, context, callback) => {

4. чем больше вы знаете, я не знал, что могу использовать chain .replace, глупый я

Ответ №2:

Вы должны поместить свое console в async лямбда-выражение. И переименуйте myTXT функцию во что-то отличное от myTXT переменной.

Попробуйте приведенный ниже код.

 const fs = require('fs');

var myTXT;

(async () => {
    const readFile = util.promisify(fs.readFile);
    await readFile('/tmp/'   myfile, 'utf8')
      .then((text) => {
          console.log('Output contents: ', text);
          myTXT = text;
      })
      .catch((err) => {
          console.log('Error', err);
      });

    var replace = function (text) {
      var s = text
          .replace(/[‘’u2018u2019u201A]/g, ''')
          .replace(/[“”u201Cu201Du201E]/g, '"')
          .replace(/u2026/g, '...')
          .replace(/[u2013u2014]/g, '-');
      return s.trim();
    };

  console.log('ReplaceSmartChars is', replace(myTXT));
})()
  

Ответ №3:

Я не знал, что такое clean-text-utils, поэтому я попробовал модуль, и он работает просто отлично:

 const fs = require('fs-then-native')
const cleanTextUtils = require('clean-text-utils');

async function clean(file) {
  let txt = await fs.readFile(file, 'utf8');
  txt = cleanTextUtils.replace.exoticChars(txt);
  return txt;
}

clean('input.txt')
  .then(result => {
    console.log(result);
  });