我希望使用 JavaScript 从 DNS 区域文件中删除所有评论。在 DNS 区域文件中,注释以分号 (;
) 开头。但是,如果分号前面有反斜杠,我也不希望分号被替换。我有一些看起来像这样的测试代码:
var record = 'example.com IN TXT "v=DKIM1\\; k=rsa\\; p=MIGf..."';
var recordWithCommentRemoved = record.replace(/[^\\];[\s\S]*?$/gm, '');
console.log(recordWithCommentRemoved); // example.com IN TXT "v=DKIM1\; k=rsa\; p=MIGf..."
上面的代码按预期工作。但是,以下代码比预期多替换了一个字符:
var record = 'test 300 IN A 100.100.100.100;this is a comment';
var recordWithCommentRemoved = record.replace(/[^\\];[\s\S]*?$/gm, '');
console.log(recordWithCommentRemoved); // test 300 IN A 100.100.100.10
在第二个示例中,我期望的是 test 300 IN A 100.100.100.100
。但是,它返回 test 300 IN A 100.100.100.10
。那么我的正则表达式有什么问题吗?
最佳答案
您需要确保 ;
前面没有 \
,因此,使用 (^|[^\\])
在 ;
之前分组并使用回调替换:
var re = /(^|[^\\]);.*/g;
var str = 'example.com IN TXT "v=DKIM1\\; k=rsa\\; p=MIGf..."\ntest 300 IN A 100.100.100.100;this is a comment';
var result = str.replace(re, function(m, g1){
return g1 ? g1 : ""; // if g1 is set/matched, re-insert it, else remove
});
document.body.innerHTML = result.replace(/\n/g, "<br/>"); // just for display
正则表达式匹配:
(^|[^\\])
-(捕获组 #1)字符串开头 (^
) 或 (|
)除了\
([^\\]
) 之外的任何字符
;
- 文字;
.*
- 除换行符外的零个或多个字符
关于javascript - 在 JavaScript 中使用替换删除注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897711/