Новая строка не соответствует регулярному выражению при использовании JavaScript ".replace"

Я использую 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()

То, что написано в файле, ничем не отличается. Я подозреваю, что это странный побочный эффект обработки новой строки, но не могу понять, что вызывает это! любая помощь будет высоко оценена.

Не понял, но это не проблема. обновлена ​​неасинхронная/ожидающая версия, которая не работает так же.

user11527868 03.06.2019 04:29

Да, теперь это имеет больше смысла, спасибо. Возможно, сохраненный файл имеет что-то вроде \r\n, а не просто \n, и в этом случае должны совпасть два символа новой строки, а не только один

CertainPerformance 03.06.2019 04:29

Я точно знаю?? Я тоже так думал, но копипаст из regexer101 все равно не получается! (совпадает на сайте, а не в коде! бред)

user11527868 03.06.2019 04:32

ты пробовал /(constructor\s\<init\>[(][)]V\n\s+\.locals )(\d+)/?

yqlim 03.06.2019 04:34

Я сделал это сейчас, все еще не удается: O Обновление экранированного вывода от cyberchef (содержат новые строки и т. д.)

user11527868 03.06.2019 04:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать использовать следующее регулярное выражение:

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? почему исправляет?

user11527868 03.06.2019 05:03

\s — это метасимвол для поиска символа пробела, это может быть пробел, табуляция, возврат каретки или новая строка.

Patrick Porto 03.06.2019 05:16
Ответ принят как подходящий

Сохраненный вами файл, скорее всего, имеет \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 часа!!! :) :) решено

user11527868 03.06.2019 05:02

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