嘿所有,这是对这个问题的跟进:Regex syntax highlighting question
我不确定当问题产生于前一个问题的答案时,程序是什么,所以如果这是错误的方法,请告诉我。
基本上,我在上一个问题中不清楚。我一直在http://www.rubular.com/试图让我的RegEx工作,但无济于事。问题在于我试图解析的消息,这些消息非常不规则并且有很多乱七八糟的嵌套引号。这是一个示例消息,这是最糟糕的情况:
2011/03/04 10:27:17 [STUFF] subject=STUFF, message={ANNOYINGFIELD1="STUFF HEADER=(STUFF,STUFF,STUFF) FIELD=STUFF FIELD=0 FIELD= FIELD=84HDH.1 FIELD=9.6 FIELD="more stuff here" FIELD=- FIELD=NO FIELD="-" ANNOYINGFIELD2="A WHOLE BUNCH OF STUFF""}
你可以把令人困惑的部分(至少对我而言)与ANNOYINGFIELD1一起使用,其引用包含了整个信息的其余部分(而且我不想给它上色,因为里面的东西需要着色),抛出一个令人敬畏的括号曲线球的HEADER,以及与第一个类似的ANNOYINGFIELD2,但实际上我确实想要将它们着色(即带有引号字符串的字段INSIDE ANNOYINGFIELD1。为了进一步澄清,我希望最终结果是类似的这......(不必坚持这一点,因为我不知道RegEx能做什么,但接近一些)。
(粗体代替颜色1,斜体颜色2)
2011/03/04 10:27:17 [STUFF] 主题 = STUFF ,消息 = { ANNOYINGFIELD1 =" STUFF HEADER =( STUFF,STUFF,STUFF )字段 = STUFF FIELD = 0 FIELD = FIELD = 84HDH.1 字段 = 9.6 字段 ="内部需要斜体,编辑器给我带来问题" 字段 = - 字段 = 否 字段 =" - " ANNOYINGFIELD2 ="更多斜体""}
由于这只是为了写作而感到困惑,如果我需要澄清任何内容,请告诉我。
修改
我一直在修改我第一次尝试提问时的一些建议,这真的很接近:((\ S +)=((?:\ x22 [^ \ x22] + \ x22 | [^>] \ s] +)))\ s它唯一搞乱的是没有值的字段(IE:FIELD1 = FIELD2 =没有接收颜色)和最后一个字段有引号的边缘情况,所以它看起来像这样: (FIELD1 ="东西东西""})有什么想法吗?
答案 0 :(得分:0)
你正在寻找一个上下文敏感的语法。换句话说,您希望根据周围的不同来匹配某些模式。传统的正则表达式并非旨在处理这种情况。但.NET具有平衡的组定义,这使得这成为可能(尽管很难)。 Ryan Byington describes the technique here. 要对此进行测试,您需要使用实际使用.NET实现的应用程序,例如Regex Hero。
但是,您可能会发现,即使具有.NET正则表达式的全部功能,您也会遇到看似无法解决的边缘情况。上下文敏感的语法就像那样复杂。
这就是为什么我实际上以embedded pushdown automaton的形式编写自己的解析器来解决这个问题。这个想法比听起来简单......
"
时,请将其添加到List<string>
。当您遇到第二个"
时,请将其从列表中弹出。就像使用堆栈一样。当堆栈顶部有一个"
时,你知道你在一对引号内。当您从左到右进行解析时,您会不断检查堆栈以确定该上下文。
答案 1 :(得分:0)
想出来!只需要一个|在最后抓住没有价值的案件......仍然dosnt处理一个案件,但这对我来说是一个足够好的妥协!
最终RegEx: (?(\ S +)=((:\ X22 [^ \ X22] + \ X22 | [^&GT; \ S] +)|))\ S
答案 2 :(得分:0)
根据一般规则,一次性解决方案可以如下所示。 Regex是Perl语言,但.net。
是相同的你有嵌套的情况,但你的条件可能不是递归均衡的。 如果它不起作用,没有损失/收益,但只是不使用它。
注意 - 标签只是占位符。在最终的正则表达式之后,使用一个替换所需的颜色控制代码。
use strict;
use warnings;
my $original_str = '2011/03/04 10:27:17 [STUFF] subject=STUFF, message={ANNOYINGFIELD1="STUFF HEADER=(STUFF,STUFF,STUFF) FIELD=STUFF FIELD=0 FIELD= FIELD=84HDH.1 FIELD=9.6 FIELD="9.6 CMP(ILD Oxide_ACL)" FIELD=- FIELD=NO FIELD="-" ANNOYINGFIELD2="A WHOLE BUNCH OF STUFF""} ';
my $str = '
2011/03/04 10:27:17 [STUFF]
subject=STUFF,
message=
{
ANNOYINGFIELD1=
"
STUFF
HEADER=(STUFF,STUFF,STUFF)
FIELD=STUFF
FIELD=0
FIELD=
FIELD=84HDH.1
FIELD=9.6
FIELD=
"
9.6 CMP(ILD Oxide_ACL)
"
FIELD=-
FIELD=NO
FIELD="-"
ANNOYINGFIELD2=
"
A WHOLE BUNCH OF STUFF
"
"
}
';
$str =~ s/(\w+)(\s*=)/<c1>$1<\/c1>$2/g;
$str =~ s/"(\s*)((?:(?!["=]|\s*").)+)(\s*)"/"$1<c2>$2<\/c2>$3"/gs;
$str =~ s/"(\s*)((?:(?!["={}]|\s*<c).)+)(\s*)/"$1<c2>$2<\/c2>$3/sg;
$str =~ s/(=\s*)((?:(?!["={]|\s*<c).)+)(?!\s*\w+\s*=)/$1<c2>$2<\/c2>/sg;
$str =~ s/<c2>(\s*)<\/c2>/$1/g;
print $str,"\n";
$original_str =~ s/(\w+)(\s*=)/<c1>$1<\/c1>$2/g;
$original_str =~ s/"(\s*)((?:(?!["=]|\s*").)+)(\s*)"/"$1<c2>$2<\/c2>$3"/gs;
$original_str =~ s/"(\s*)((?:(?!["={}]|\s*<c).)+)(\s*)/"$1<c2>$2<\/c2>$3/sg;
$original_str =~ s/(=\s*)((?:(?!["={]|\s*<c).)+)(?!\s*\w+\s*=)/$1<c2>$2<\/c2>/sg;
$original_str =~ s/<c2>(\s*)<\/c2>/$1/g;
print $original_str,"\n";
__END__
输出:
2011/03/04 10:27:17 [STUFF]
<c1>subject</c1>=<c2>STUFF,</c2>
<c1>message</c1>=
{
<c1>ANNOYINGFIELD1</c1>=
"
<c2>STUFF</c2>
<c1>HEADER</c1>=<c2>(STUFF,STUFF,STUFF)</c2>
<c1>FIELD</c1>=<c2>STUFF</c2>
<c1>FIELD</c1>=<c2>0</c2>
<c1>FIELD</c1>=
<c1>FIELD</c1>=<c2>84HDH.1</c2>
<c1>FIELD</c1>=<c2>9.6</c2>
<c1>FIELD</c1>=
"
<c2>9.6 CMP(ILD Oxide_ACL)</c2>
"
<c1>FIELD</c1>=<c2>-</c2>
<c1>FIELD</c1>=<c2>NO</c2>
<c1>FIELD</c1>="<c2>-</c2>"
<c1>ANNOYINGFIELD2</c1>=
"
<c2>A WHOLE BUNCH OF STUFF</c2>
"
"
}
2011/03/04 10:27:17 [STUFF] <c1>subject</c1>=<c2>STUFF,</c2> <c1>message</c1>={<c1>ANNOYINGFIELD1</c1>="<c2>STUFF</c2> <c1>HEADER</c1>=<c2>(STUFF,STUFF,STUFF)</c2> <c1>FIELD</c1>=<c2>STUFF</c2> <c1>FIELD</c1>=<c2>0</c2> <c1>FIELD</c1>= <c1>FIELD</c1>=<c2>84HDH.1</c2> <c1>FIELD</c1>=<c2>9.6</c2> <c1>FIELD</c1>="<c2>9.6 CMP(ILD Oxide_ACL)</c2>" <c1>FIELD</c1>=<c2>-</c2> <c1>FIELD</c1>=<c2>NO</c2> <c1>FIELD</c1>="<c2>-</c2>" <c1>ANNOYINGFIELD2</c1>="<c2>A WHOLE BUNCH OF STUFF</c2>""}