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