Почему метод match() возвращает null при чтении файла с помощью FileReader()?

Я загружаю файл с помощью FileReader() и читаю его содержимое с использованием readAsText(). В консоли отображается текст файла, но когда я использую регулярное выражение match(), оно возвращает null. При этом, если я задаю строку напрямую, как в примере <code>str="&lt;STATION_CALLSIGN:5&gt;......";</code>, то регулярное выражение работает и извлекает нужные данные. У меня уже возникала подобная проблема, о которой я спрашивал в следующем вопросе: <a href="https://qna.habr.com/q/1391654" rel="nofollow">Как прочитать файл через РНР, чтобы обработать его яваскриптом?</a>. В том случае я использовал fopen() для открытия файла, и мне предложили решение. Также там рекомендовали обрабатывать данные только через JavaScript, и теперь у меня возникла аналогичная проблема с извлечением данных из загруженного файла. Вот соответствующий код: <pre><code class="javascript">document.querySelector('[type="file"]').addEventListener('change', (e) =&gt; {
  // сохраним в переменную files значение свойства files
  const files = e.target.files;
  // сохраним количество элементов в files в переменную countFiles
  const countFiles = files.length;
  // если количество выбранных файлов больше 0
  if (!countFiles) {
      alert('Не выбран файл!');
      return;
    }
  // присваиваем переменной selectedFile ссылку на выбранный файл
    const selectedFile = files[0];

    const reader = new FileReader();
    reader.readAsText(selectedFile);
    reader.addEventListener('error', () =&gt; {
      console.error(`Произошла ошибка при чтении файла: ${selectedFile.name}`);
    });
      reader.onload = function(event) {
          const data = event.target.result;
          console.log(data);  // 
          let arr_call_rx = data.match('/(?&lt;=\&lt;CALL:(\d)\&gt;).+?(?=\&lt;)/g');
          var arr_
  • 11 марта 2025 г. 17:04
Ответы на вопрос 1
Судя по вашему описанию и коду, проблемами с использованием метода `match` могут быть следующие:

1. **Регулярное выражение**: Ваша строка, которую вы используете для поиска, должна быть корректно записана в формате регулярного выражения. В коде вы используете строку в одинарных кавычках, а регулярное выражение объявлено с помощью косых черт (`/`). Таким образом, JavaScript не понимает, что это регулярное выражение. Вместо этого нужно использовать конструкцию без кавычек. Также обратите внимание на то, что вы используете `(?<=...)` – это "positive lookbehind". Поддержка этого синтаксиса в различных браузерах может отличаться.

2. **Использование escape-последовательностей**: В вашей строке есть HTML-сущности. Они могут не соответствовать регулярному выражению. Убедитесь, что вы используете правильные символы в регулярном выражении.

3. **Пробелы и невидимые символы**: Возможно, в строке `data`, которую вы получаете из файла, есть дополнительные пробелы или невидимые символы, которые не учитываются в вашем регулярном выражении.

Попробуйте улучшить код следующим образом:

```javascript
document.querySelector('[type="file"]').addEventListener('change', (e) => {
    const files = e.target.files;
    const countFiles = files.length;

    if (!countFiles) {
        alert('Не выбран файл!');
        return;
    }

    const selectedFile = files[0];

    const reader = new FileReader();
    reader.readAsText(selectedFile);
    reader.addEventListener('error', () => {
        console.error(`Произошла ошибка при чтении файла: ${selectedFile.name}`);
    });

    reader.onload = function(event) {
        const data = event.target.result;
        console.log(data); 

        // Регулярное выражение для поиска CALL, должно начинаться и заканчиваться с "/"
        let arr_call_rx = data.match(/(?<=<CALL:\d+>).*?(?=<)/g);
        
        // Проверяем, нашли ли что-то
        if (arr_call_rx) {
            console.log(arr_call_rx);
        } else {
            console.log("Совпадений не найдено.");
        }
    };
});
```

### Что было изменено:
- Я убрал кавычки, окружающие регулярное выражение, чтобы JavaScript мог корректно интерпретировать его.
- Убедитесь, что ваше регулярное выражение обновлено в соответствии с данными, которые вы ищете, и корректно ссылались на нужные элементы.

### Дополнительно:
- Если после этих изменений `arr_call_rx` по-прежнему возвращает `null`, вы можете добавить отладочные сообщения, чтобы проверить, что именно содержится в переменной `data`, и убедиться, что текст в файле соответствует шаблону, который вы задаете в регулярном выражении.
Похожие вопросы