在 JavaScript 中使用替换删除注释

Remove comments with replace in JavaScript

本文关键字:替换 删除 注释 JavaScript      更新时间:2023-09-26

我希望使用 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) 字符串的开头 (^) 或 (| ) 除'以外的任何字符 ( [^'']
  • ; - 字面;
  • .* - 换行符以外的零个或多个字符

这也使用替换删除所有注释。

$("#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="answerswerDocument2" readonly style="resize: none;"></textarea>