C# 正则表达式语法高亮问题跟进

C# 正则表达式语法高亮问题跟进,c#,regex,C#,Regex,大家好,这是这个问题的后续: 我不确定当一个问题是由前一个问题的答案衍生出来的时,程序是什么,所以如果这是一个错误的方式,请让我知道 基本上,我在前面的问题中不清楚。我一直在胡闹,试图让我的正则表达式工作,但没有用。问题在于我试图解析的消息,这些消息非常不规则,并且有很多混乱的嵌套引号。下面是一个示例消息,这几乎是最坏的情况: 2011/03/04 10:27:17 [STUFF] subject=STUFF, message={ANNOYINGFIELD1="STUFF HEADER=(S

大家好,这是这个问题的后续:

我不确定当一个问题是由前一个问题的答案衍生出来的时,程序是什么,所以如果这是一个错误的方式,请让我知道

基本上,我在前面的问题中不清楚。我一直在胡闹,试图让我的正则表达式工作,但没有用。问题在于我试图解析的消息,这些消息非常不规则,并且有很多混乱的嵌套引号。下面是一个示例消息,这几乎是最坏的情况:

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""}
正如你所能看到的,令人困惑的部分(至少对我来说)是HappingField1,它的引用包含了整个消息的其余部分(我不想给它上色,因为里面的东西需要上色),标题抛出了一个很棒的圆括号curveball,还有HappingField2,这与第一个类似,但我确实希望这些字段是彩色的(即,在烦扰字段1中带引号的字符串的字段。为了进一步澄清,我希望最终结果是这样的…(不必坚持这个,因为我不知道正则表达式能够做什么,但有些接近)

(粗体将取代颜色1,斜体将取代颜色2)

2011/03/04 10:27:17[STUFF]主题=STUFF,消息={烦人字段1=“STUFF标题=(STUFF,STUFF,STUFF,STUFF)字段=0字段=84HDH.1字段=9.6字段=”内部需要斜体,编辑给我问题“字段=-字段=否字段=”-“烦人字段2=“更多斜体”}

由于这是混乱的只是写,请让我知道,如果我需要澄清什么

编辑


我一直在修改我第一次尝试提问时提出的一些建议,这非常接近:((\S+)=((?:\x22[^\x22]+\x22[^>\S]+)\S它唯一搞砸的是没有值的字段(即:FIELD1=FIELD2=没有接收颜色)和最后一个字段带有引号的偶然边缘情况,因此看起来像这样:(FIELD1=“stuff”“})有什么想法吗?

您看到的是上下文相关的语法。换句话说,您希望根据周围的内容对某些模式进行不同的匹配。传统上,正则表达式不是用来处理这些问题的。但是.NET有平衡的组定义,这使得这成为可能(尽管困难)。 要测试这一点,您需要使用实际使用.NET实现的应用程序,例如


然而,您可能会发现,即使使用.NET正则表达式的全部功能,您也会遇到似乎无法解决的边缘情况。上下文敏感语法就是这样复杂

这就是为什么我实际上以一种形式编写了自己的解析器来解决这个问题

  • 从左到右一次解析一个字符的字符串
  • 当您遇到一个
    时,将其添加到
    列表中。当您遇到第二个
    时,将其从列表中弹出

这就像使用堆栈一样。当堆栈顶部有一个
在它上面,你就知道你在一对引号中。当你从左到右解析时,你不断地检查堆栈以建立上下文。

找到了答案!只需要在末尾加一个|就可以抓住没有价值的情况…仍然不能处理那个一端的情况,但这对我来说已经足够好了

最终正则表达式:
((\S+)=((?:\x22[^\x22]+\x22[^>\S]+))\S

只要给出一般规则,一次性解决方案可以如下所示。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__
使用严格;
使用警告;
my$original_str='2011/03/04 10:27:17[STUFF]subject=STUFF,message={HappingField1=“STUFF HEADER=(STUFF,STUFF,STUFF,STUFF)FIELD=0 FIELD=FIELD=84HDH.1 FIELD=9.6 FIELD=“9.6 CMP(ILD Oxide_ACL)”FIELD=-FIELD=NO FIELD=“-“Happingfield2=”一大堆STUFF”“;
我的$str
2011/03/04 10:27:17[资料]
主题=东西,
信息=
{
烦恼场1=
"
东西
头=(东西,东西,东西)
字段=内容
字段=0
场=
字段=84HDH.1
字段=9.6
场=
"
9.6化学机械抛光(氧化层厚度)
"
场=-
字段=否
FIELD=“-”
烦恼场2=
"
一大堆东西
"
"
}
';
$str=~s/(\w+)(\s*=)/$1$2/g;
$str=~s/“(\s*)((?:(?![“=]|\s*”)+)(\s*)“/“$1$2$3”/gs;

$str=~s/“(\s*)((?:(?![”={}]}\s*我真的很喜欢这个想法,可能会尝试一下,但我一直在修改我第一次尝试问这个问题时提出的一些建议,这非常接近:(\s+=(?:\x22[^\x22]+\\x22[^>\s]+)\s唯一弄乱的是没有价值的字段(即:FIELD1=FIELD2=没有颜色)就像你说的,一个边缘案例,其中最后一个字段有引号,所以它看起来是这样的:(FIELD1=“stuff”“})有什么想法吗?@Hershizer33-我看到你发现了一些适合你的东西,你可能已经开始前进了。但实际上,我为一个类似的问题编写了一个小解析器,你可能会感兴趣。事实上,我在这个答案中提到的堆栈思想比这个任务所需要的更加健壮,并且可以像我在这里的答案中那样简化。。。
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>""}