#javascript #node.js #regex #replace
#javascript #node.js #регулярное выражение #заменить
Вопрос:
У меня есть небольшой скрипт, который я тестирую, но, похоже, не могу заставить вывод работать правильно.
У меня есть множество файлов markdown с URL-адресами в них и массив, который создается из мертвых URL-адресов (это внутренние ссылки, а не общедоступные).
const urls = [
'http://internal.site1.com',
'https://internal.site2.com',
'http://internal.site3.com/file.html',
'https://internal.site4.com/dir/'
];
const markdown = [
'./file1.md',
'./file2.md',
'./sub/file3.md',
'./sub/sub/file4.md',
];
И я зацикливаю файлы markdown из массива, а затем пытаюсь заменить url
из возвращенных данных:
for( const md of markdown ) {
var mdFileContents = fs.readFileSync( md, 'utf8' );
for( const url of urls ) {
var result = mdFileContents.replaceAll( url, '[X]' );
// also tried: var result = mdFileContents.replace( new RegExp( url, "g" ), "[X]" );
}
}
За исключением случаев, когда это выполняется, и я делаю console.log(result);
, я либо не получаю замен, либо получаю только один URL (для одного файла) из всех замененных файлов.
Мои тестовые файлы markdown в духе:
HTTP URL: http://internal.site1.com
HTTPS URL: https://internal.site2.com
[md shortcode](http://internal.site3.com/file.html)
[mb shortcode](https://internal.site4.com/dir/)
С одним тестовым md
файлом без совпадающих URL-адресов. Результаты скрипта отображаются в виде:
HTTP URL: [X]
HTTPS URL: https://internal.site2.com
[md shortcode](http://internal.site3.com/file.html)
[mb shortcode](https://internal.site4.com/dir/)
Я что-то делаю неправильно или в неправильном порядке?
Ответ №1:
Сначала вы запускаете цикл для файлов. Затем для каждого файла зациклите URL-адреса и запустите:
var result = mdFileContents.replaceAll( url, '[X]' );
Таким образом, для каждого URL-адреса вы перечитываете содержимое файла (которое по-прежнему остается неизмененным) и заменяете соответствующий URL-адрес на [X]
Теперь при запуске console.log(result);
вы увидите только одну замену, поскольку вы каждый раз перечитываете содержимое файла.
Вы можете прочитать содержимое каждого файла в for exampele mdFileContents
, а затем выполнить замены для всех URL-адресов, повторно mdFileContents
используемых до тех пор, пока все замены не будут выполнены.
Обратите внимание, что ваши URL-адреса содержат точку. Когда вы передаете строку в конструктор регулярных выражений, вам нужно дважды экранировать точку \.
, чтобы она соответствовала буквально, иначе точка будет соответствовать любому символу, кроме новой строки.
let mdFileContents = fs.readFileSync( md, 'utf8' );
for( const url of urls ) {
mdFileContents = mdFileContents.replace( new RegExp( url, "g" ), "[X]" );
}
console.log(mdFileContents);
Комментарии:
1. это имеет смысл — не могу поверить, что я этого не видел!
2. @markb Не беспокойтесь, это случается 🙂 Удачи!