正则表达式语法突出显示问题跟进

时间:2011-03-11 16:41:42

标签: c# regex

嘿所有,这是对这个问题的跟进: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 ="东西东西""})有什么想法吗?

3 个答案:

答案 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>""}