从文本中删除注释,但引号之间的注释字符除外

时间:2012-01-26 13:25:26

标签: regex comments

我正在尝试构建一个用于从配置文件中删除注释的正则表达式。注释标有;个字符。例如:

; This is a comment line
keyword1 keyword2 ; comment
keyword3 "key ; word 4" ; comment

我遇到的困难是当它置于引号之间时忽略了注释字符。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

只有当分号后跟偶数引号时,您才可以尝试匹配分号:

;(?=(?:[^"]*"[^"]*")*[^"]*$).*

请务必使用此正则表达式,Singleline选项已关闭关闭,而Multiline选项已在上启用

在Python中:

>>> import re
>>> t = """; This is a comment line
... keyword1 keyword2 ; comment
... keyword3 "key ; word 4" ; comment"""
>>> regex = re.compile(';(?=(?:[^"]*"[^"]*")*[^"]*$).*', re.MULTILINE)
>>> regex.sub("", t)
'\nkeyword1 keyword2 \nkeyword3 "key ; word 4" '

答案 1 :(得分:0)

没有正则表达式:)

$ grep -E -v '^;' input.txt
keyword1 keyword2 ; comment
keyword3 "key ; word 4" ; comment

答案 2 :(得分:0)

您可以使用正则表达式首先获取所有字符串,将其替换为某个占位符,然后简单地切断所有\$.*,并最后替换掉字符串:)

答案 3 :(得分:0)

这样的事情:

("[^"]*")*.*(;.*)

首先,在引号之间匹配任意数量的文本,然后匹配a。如果;在引号之间,它将匹配第一组,而不是第二组。

答案 4 :(得分:0)

我(有点意外)想出了一个正则表达式:

replace(/^((?:[^'";]*(?:'[^']*'|"[^"]*")?)*)[ \t]*;.*$/gm, '$1')

我想:

  • 删除行首或行尾的单行注释
  • 使用单引号和双引号,
  • 在评论中只有一个引用的能力: ' s 有用(但接受{{1} }以及)
    (因此,在Tim Pietzcker's answer中的注释分隔符之后匹配平衡集(偶数)引号是不合适的,
  • 正确(已关闭)引用'字符串'
  • 中单独留下评论分隔符"
  • 混合引用样式
  • 多个引用的字符串(以及评论中/后的评论)
  • 在resp中嵌套单/双引号双/单引号'字符串'
  • 要处理的数据就像有效的ini文件(或汇编)一样,只要它不包含转义引号或正则表达式文字等。

缺乏对javascript的回顾我认为不匹配评论(并将其替换为;),可能是一个想法,但匹配评论之前的数据< / em>然后用子匹配数据替换完整匹配数据 人们可以逐行设想这个概念(因此用匹配替换整行,从而放弃评论), BUT 多行参数不会似乎完全按照这种方式工作(至少在浏览器中)。

''开始吃“开始”中的任何字符。那些不是 [^'";]* (完全违反直觉(对我而言),'";工作。)

[^'";\r\n]*是一个非捕获组,与(?:'[^']*'|"[^"]*")? quote any chars quote(?:(['"])[^\2]*\2)?中的零个或一组匹配 /^((?:[^'";]*(?:(['"])[^\2]*\2)?)*)[ \t]*;.*$/gm中的(?:(['"])[^\2\r\n]*\2)?(虽然神奇地更好)做工作(在/^((?:[^'";]*(?:(['"])[^\2\r\n]*\2)?)*)[ \t]*;.*$/gm上打破),但是没有添加另一个捕获组以便在匹配中重复使用这是一件好事,因为无论如何都会受到惩罚。)

上面的组合被放置在一个非捕获组中,该组可能重复零次或多次,并且它的结果被放置在一个捕获组db 'WDVPIVAlQEFQ;WzRcU',"hi;hi",0xfe,"'as中传递。

这给我们留下了1,而这只是&#39;简单地&#39;匹配零个或多个空格和制表符后跟分号,后跟零个或多个不是新行的字符。请注意[ \t]*;.*不是可选的!!!

要更好地了解此(多行参数)的工作原理,请点击下面演示中的;按钮。

&#13;
&#13;
exp
&#13;
function demo(){
  var elms=document.getElementsByTagName('textarea');
  var str=elms[0].value;
  elms[1].value=str.replace( /^((?:[^'";]*(?:'[^']*'|"[^"]*")?)*)[ \t]*;.*$/gm
                           , '$1'
                           )
                   .replace( /[ \t]*$/gm, ''); //optional trim
}


function demo_exp(){
  var elms=document.getElementsByTagName('textarea');
  var str=elms[0].value;
  elms[1].value=str.replace( /^((?:[^'";]*(?:'[^']*'|"[^"]*")?)*)[ \t]*;.*$/gm
                           , '**S**$1**E**'  //to see start and end of match.
                           );
}
&#13;
&#13;
&#13;

希望这有帮助。

PS:请评论有效的示例,如果这可能会破坏!由于我普遍同意(根据广泛的个人经验),使用正则表达式(尤其是更高级别的编程语言)无法可靠地删除注释,我的直觉仍然是说这不可能是万无一失的。但是,我一直在抛出现有数据并精心制作了“假设”和“假设”。在它超过2个小时并且无法让它破裂(我通常非常擅长)。