我正在尝试构建一个用于从配置文件中删除注释的正则表达式。注释标有;
个字符。例如:
; This is a comment line
keyword1 keyword2 ; comment
keyword3 "key ; word 4" ; comment
我遇到的困难是当它置于引号之间时忽略了注释字符。
有什么想法吗?
答案 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} }以及)"
缺乏对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]*;.*
不是可选的!!!
要更好地了解此(多行参数)的工作原理,请点击下面演示中的;
按钮。
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;
希望这有帮助。
PS:请评论有效的示例,如果这可能会破坏!由于我普遍同意(根据广泛的个人经验),使用正则表达式(尤其是更高级别的编程语言)无法可靠地删除注释,我的直觉仍然是说这不可能是万无一失的。但是,我一直在抛出现有数据并精心制作了“假设”和“假设”。在它超过2个小时并且无法让它破裂(我通常非常擅长)。