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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать .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:
^ -- якорь в начале текста.*? -- не жадное сканирование( -- начало группы захвата 1Starting test: Connectivity -- ожидать буквальный текст.*? -- не жадное сканированиеpassed test Connectivity -- ожидать буквальный текст) -- конец группы захвата 1.* -- жадное сканирование$ -- якорь в конце текста/s -- модификатор s для включения новых строк в .Объяснение regex2:
regex1, но группа захвата более узкаябольшое спасибо Питер! Это исправило это! Так что в JS это возможно, как и в других языках :) Я думаю, что неправильно понял, что может сделать replace()... ваше регулярное выражение1 делает то, что мне нужно. Еще раз спасибо
По умолчанию
.соответствует только символам без разрыва строки, то есть не совпадает между строками. Чтобы изменить это поведение, вы должны использовать однострочный модификаторs, который рассматривает всю строку как одну строку по отношению к..