gpt4 book ai didi

node.js - 使用 JavaScript 的 ".replace"时,正则表达式中的换行符不匹配

转载 作者:太空宇宙 更新时间:2023-11-03 23:57:28 40 4
gpt4 key购买 nike

我使用 node.js 读取文件,将结果保存到变量,然后用另一个字符串替换正则表达式匹配并将结果写入文件。

最奇怪的事情发生了。我使用了 Regex101(带有 JS 引擎集和与我的代码相同的标志)并且它与我想要的文本匹配。链接:https://regex101.com/r/WbmOLw/1

在我的代码中实现完全相同的正则表达式,它无法匹配!

我创建了代表我的代码的最小版本:

tst.txt(目标文件):

# Direct Methods
.method public constructor <init>()V
.locals 2

这似乎是原始字符串(根据 Cyber​​Chef 的说法):

# 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.log(data) // not changed
fs.writeFile(mainDir, data, 'utf8', function (err) {
if (err) return console.log(err);
})

});
}

start()

文件中写入的内容根本没有不同。我怀疑这是换行处理的奇怪副作用,但无法弄清楚是什么原因造成的!任何帮助将不胜感激。

最佳答案

您保存的文件很可能有 \r\n作为换行符终止符,而不仅仅是 \n ,所以V.模式不匹配。当使用 Notepad++ 使用 \r\n 保存文件时,我可以在 Windows 上重现该问题。设置已启用。使用\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 修饰符)

关于node.js - 使用 JavaScript 的 ".replace"时,正则表达式中的换行符不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56420463/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com