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

标签 node.js

我使用 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/

相关文章:

java - crypto.pbkdf2 (node.js) 和 PBEKeySpec 之间 key 长度的差异

node.js - 按主机名进行条件端口转发

javascript - 以中间件的形式表达 Try and Catch

javascript - 从 Stripe 页面重定向 URL Node.js 获取参数

node.js - 如何对使用命令行参数的工具进行单元测试

javascript - Node JS 试图将访问 token 分配给变量

javascript - 如何根据参数拆分对象数组,仅对一个进行排序,然后在 Lodash 中再次加入

javascript - 为什么这一行会导致 Javascript 崩溃?

node.js - Mongoose :独特的领域不起作用

javascript - 列出 OneDrive 目录内容而不递归到子目录