Я использую node.js для чтения файла, сохранения результатов в переменной, затем заменяю совпадение регулярного выражения другой строкой и записываю результат в файл.
Произошло самое странное. Я использовал Regex101 (с установленным движком JS и теми же флагами, что и мой код), и он соответствовал моему желаемому тексту. Ссылка: https://regex101.com/r/WbmOLw/1
Реализация точно такого же регулярного выражения в моем коде не соответствует!
Я создал самую минимальную версию, представляющую мой код:
tst.txt (целевой файл):
# Direct Methods
.method public constructor <init>()V
.locals 2
Кажется, это необработанная строка (согласно CyberChef):
# direct methods\n.method public constructor <init>()V\n .locals 2
test.js (код):
var fs = require('fs');
var mainDir = 'tst.txt'
function start(){
fs.readFile(mainDir, "utf-8", function (err, data) {
data = data.replace(/(constructor \<init\>[(][)]V. \.locals )(\d+)/gms, 'BLABLAIDONTWORK')
console.info(data) // not changed
fs.writeFile(mainDir, data, 'utf8', function (err) {
if (err) return console.info(err);
})
});
}
start()
То, что написано в файле, ничем не отличается. Я подозреваю, что это странный побочный эффект обработки новой строки, но не могу понять, что вызывает это! любая помощь будет высоко оценена.
Да, теперь это имеет больше смысла, спасибо. Возможно, сохраненный файл имеет что-то вроде \r\n, а не просто \n, и в этом случае должны совпасть два символа новой строки, а не только один
Я точно знаю?? Я тоже так думал, но копипаст из regexer101 все равно не получается! (совпадает на сайте, а не в коде! бред)
ты пробовал /(constructor\s\<init\>[(][)]V\n\s+\.locals )(\d+)/?
Я сделал это сейчас, все еще не удается: O Обновление экранированного вывода от cyberchef (содержат новые строки и т. д.)





Вы можете попробовать использовать следующее регулярное выражение:
var fs = require('fs');
var mainDir = 'tst.txt'
function start(){
fs.readFile(mainDir, "utf-8", function (err, data) {
data = data.replace(/(constructor \<init\>[(][)]V\n*\s*\.locals\s)(\d+)/gms, 'BLABLAIDONTWORK')
console.info(data) // not changed
fs.writeFile(mainDir, data, 'utf8', function (err) {
if (err) return console.info(err);
})
});
}
start()
Работает :) спасибо! Что такое S? почему исправляет?
\s — это метасимвол для поиска символа пробела, это может быть пробел, табуляция, возврат каретки или новая строка.
Сохраненный вами файл, скорее всего, имеет \r\n в качестве разделителя новой строки, а не просто \n, поэтому шаблон V. не совпадает. Я могу воспроизвести проблему в Windows, когда файл был сохранен с помощью Notepad ++ с включенной настройкой \r\n. Вместо этого использование \r\n в шаблоне сработало для меня:
data = data.replace(/(constructor \<init\>[(][)]V\r\n \.locals )(\d+)/g, 'BLABLAIDONTWORK')
// ^^^^
Чтобы шаблон был более гибким, для соответствия новой строке на любой платформе чередуйте с \n и (в редких случаях) \r:
data = data.replace(/(constructor \<init\>[(][)]V(?:\r\n|\r|\n) \.locals )(\d+)/g, 'BLABLAIDONTWORK')
// ^^^^^^^^^^^^^^
(больше нет необходимости в модификаторе s или вообще в модификаторе m)
Оооо да чувак! Спасибо!! :) :) Я сидел на этом по крайней мере 3 часа!!! :) :) решено
Не понял, но это не проблема. обновлена неасинхронная/ожидающая версия, которая не работает так же.