Javascript использует match() для выбора всего абзаца

Я пытаюсь извлечь весь абзац из текстового файла с помощью JS, а затем поместить его в элемент html. Я уже прочитал довольно много сообщений и статей, но не могу найти правильную формулу регулярного выражения. Это выдержка из txt файла:

Doing initial required tests

   
   Testing server: xxxxxxxx\yyyyyyyy

      Starting test: Connectivity

         * Active Directory LDAP Services Check
         Determining IP4 connectivity 
         * Active Directory RPC Services Check
         ......................... yyyyyyyy passed test Connectivity



Doing primary tests


Что мне нужно извлечь, так это от «Начальный тест: подключение» до «пройденный тест подключения». Это код JS, который я пытаюсь:

`

async function getText(file) {
  let dcdiagFile = await fetch(file);
  let dcDiag = await dcdiagFile.text();
  let connectivity = dcDiag.match(/Starting test: Connectivity[\n\r]+$(.*)(/gm) || [];
  document.getElementById("DNS").innerHTML = connectivity;
  console.info(connectivity);
}
getText("./dcdiagreport.txt");

` С моим кодом я получаю только первую строку. Я думал, что подстановочный знак решит эту проблему, но если я добавлю слово Connectivity, как показано ниже:

let connectivity = dcDiag.match(/Starting test: Connectivity[\n\r]+$(.*)Connectivity (/gm) || [];

Я ничего не понимаю. В других языках программирования я бы использовал абзац «Начало текста * окончание текста». Но не в JS. Это интранет-серверы без интернета, и я предпочтительно не хочу загружать jquery. Только ванильный JS.

По умолчанию . соответствует только символам без разрыва строки, то есть не совпадает между строками. Чтобы изменить это поведение, вы должны использовать однострочный модификатор s, который рассматривает всю строку как одну строку по отношению к ..

oriberu 08.12.2022 09:35

Другой подход к решению этой проблемы состоит в том, чтобы сопоставить все последовательные строки, ведущие с одним и тем же горизонтальным пробелом после вашей ключевой строки. Что-то вроде Starting test: Connectivity[\r\n]+^([ \t]+).*(?:\r?\n\1.*)*. Демонстрация Regex101.

oriberu 08.12.2022 09:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать .replace() вместо .match(), чтобы сохранить только нужный текст.

Вы не указали, хотите ли вы включить или исключить ключи «Начало теста: подключение» до тех пор, пока «тест подключения не пройден». Вот тест с regex1, который включает ключи, и regex2, который исключает ключи:

const input = `Doing initial required tests
      Testing server: xxxxxxxx\yyyyyyyy

      Starting test: Connectivity

         * Active Directory LDAP Services Check
         Determining IP4 connectivity 
         * Active Directory RPC Services Check
         ......................... yyyyyyyy passed test Connectivity

Doing primary tests`;

const regex1 = /^.*?(Starting test: Connectivity.*?passed test Connectivity).*$/s;
let connectivity1 = input.replace(regex1, '$1');
console.info(connectivity1);

const regex2 = /^.*?Starting test: Connectivity\s*(.*?)\s*passed test Connectivity.*$/s;
let connectivity2 = input.replace(regex2, '$1');
console.info(connectivity2);

Объяснение regex1:

  • ^ -- якорь в начале текста
  • .*? -- не жадное сканирование
  • ( -- начало группы захвата 1
  • Starting test: Connectivity -- ожидать буквальный текст
  • .*? -- не жадное сканирование
  • passed test Connectivity -- ожидать буквальный текст
  • ) -- конец группы захвата 1
  • .* -- жадное сканирование
  • $ -- якорь в конце текста
  • /s -- модификатор s для включения новых строк в .

Объяснение regex2:

  • похоже на regex1, но группа захвата более узкая

большое спасибо Питер! Это исправило это! Так что в JS это возможно, как и в других языках :) Я думаю, что неправильно понял, что может сделать replace()... ваше регулярное выражение1 делает то, что мне нужно. Еще раз спасибо

sigfried 08.12.2022 10:54

Другие вопросы по теме