我希望使用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
。那么我的正则表达式出了什么问题?
答案 0 :(得分:3)
您需要确保;
之前没有\
,因此,请在(^|[^\\])
之前使用;
组,并使用回调替换:
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)字符串开头(^
)或(|
)任何字符,但\
([^\\]
)< / LI>
;
- 文字;
.*
- 除换行符以外的零个或多个字符答案 1 :(得分:0)
这也会使用替换删除所有注释。
$("#doc").keyup(function(evt) {
var doc = $("#doc").val();
var documentNew = String(doc).replace(/(\r\n|\n|\r)/gm, "\n");
var str = documentNew;
var lines = str.split('\n');
var filterred = lines.filter(function(line) {
return line.indexOf('//') != 0;
});
filterred = String(filterred).replace(/;/g, "; \n");
$("#answerDocument2").html(filterred);
});
textarea {
width: 200px;
height: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h3>Paste Code</h3>
<textarea id="doc"></textarea>
<h3>Copy Formatted Code</h3>
<textarea id="answerDocument2" readonly style="resize: none;"></textarea>