JavaScript中使用replace函数删除注释

3
我希望用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。那么我的正则表达式出了什么问题呢?
2个回答

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) 字符串开头 (^) 或 (|) 任意非 \ 字符 ([^\\])
  • ; - 分号字面量 ;
  • .* - 零个或多个除换行符以外的字符

0

这也使用 replace 方法删除所有注释。

$("#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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接