Функция String.match () возвращает ноль, даже если есть совпадение - PullRequest
0 голосов
/ 09 февраля 2019

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

Я пробовал те же данные и регулярное выражение на RegExr и показывает совпадение.

следующий код

var fs = require('fs');
try {  
    var data = fs.readFileSync('File.txt', 'utf8');
    data = data.toString();
    var regex = /^(hi|hI|Hi|HI)\s[^dD].*?$/gm;
    var result = data.match(regex);
} catch(e) {
    console.log('Error:', e.stack);
}

и это содержимое файла

Hi Alex how are you doing
hI dave how are you doing
Good by Alex
hidden agenda
Alex greeted Martha by saying Hi Martha

Я использовал те же данные на RegExr, и первая строка показывается как совпадение.но когда я запускаю приведенный выше код на моей машине, переменная результата остается нулевой.

есть что-то, чего мне не хватает?

ниже приведены некоторые снимки экрана, пока я отлаживал код в vscode.

  1. содержимое переменной данных enter image description here

  2. состояние переменной результата.enter image description here

  3. результат JSON.stringify enter image description here

Редактировать.Результаты JSON.stringify

Я запустил программу на cmd, и перед строкой шокирует пробел.

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

Когда вы читаете файл с помощью fs.readFileSync, спецификация не удаляется из прочитанных данных, и дело до программиста.См. fs.readFileSync (имя файла, utf8 ') не удаляет маркеры спецификации .

Вы можете просто использовать

data = data.replace(/^\uFEFF/, '')

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

Обратите внимание, что вы не видите спецификацию при открытии текстовых файлов в текстовых редакторах, таких как VIM, Notepad, поскольку они могут обрабатывать спецификацию.

0 голосов
/ 09 февраля 2019

Проблема была решена с помощью приведенного выше ответа @ vsemozhetbyt и множества полезных комментариев.

Я добавляю этот ответ, чтобы помочь, если кто-нибудь столкнется с какой-либо проблемой в будущем.

почему это произошло?

Из-за неправильной кодировки в моем конкретном случае File.txt изначально был File.jsp, и я изменил его расширение на .txt и сохранил его.после этого я прочитал файл file.txt, который содержал тот же текст, что и JSP, и сделал то же соответствие регулярному выражению, что он работал нормально, и в файле не было спецификации.

Проблема возникла, когда я открыл файл в блокноте и заменил все егосодержание с 5 строками текста показано в вопросе и сохранено.

что такое спецификация

Прочитайте эту замечательную статью

Как я удалил спецификацию

Я открыл файл в двоичном режиме в vim, используя

vim -b File.txt

, и я удалил первые три символа (байты)

0 голосов
/ 09 февраля 2019

Пробел в выводе JSON выглядит как BOM .Если это так, data.codePointAt(0) должно быть 65279.

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