用于匹配非转义字符的正则表达式

本文关键字:正则表达式 转义字符 用于 | 更新日期: 2023-09-27 18:33:20

我需要正则表达式匹配关键字的值和可选的类型,其中可能的条件如下。

在下面的示例中,我卷曲地支撑了需要捕获的字段。SOMEVALUEXXX 总是应该在那里,尽管在极少数情况下,该值可能是空/空字符串。TYPE=XXXX 是一个可选参数,可能不存在。

我能够产生的最接近的正则表达式如下:^ANNIVERSARY(?:(?::)|(?:;.*:))([^:]*)$它将捕获周年纪念的值,但当值中有转义冒号(/:)时将无法这样做。

SOMEKEYWORD:{SOMEVALUE}
SOMEKEYWORD:{SOMEVALUE/:WITHCOLONESCAPED}
SOMEKEYWORD:{SOMEVALUE/:WITHSEMICOLONESCAPED}
SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE}
SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE/:WITHCOLONESCAPED}
SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE/;WITHSEMICOLONESCAPED}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE/:WITHCOLONESCAPED}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE/;WITHSEMICOLONESCAPED}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE/:WITHCOLONESCAPED}
SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE/;WITHSEMICOLONESCAPED}

用于匹配非转义字符的正则表达式

保留大括号不变以进行演示,但即使删除也会产生所需的结果:

var testing = new string[]
{
    "SOMEKEYWORD:{SOMEVALUE}",
    "SOMEKEYWORD:{SOMEVALUE/:WITHCOLONESCAPED}",
    "SOMEKEYWORD:{SOMEVALUE/;WITHSEMICOLONESCAPED}",
    "SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE}",
    "SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE/:WITHCOLONESCAPED}",
    "SOMEKEYWORD;TYPE={SOMETYPE}:{SOMEVALUE/;WITHSEMICOLONESCAPED}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE/:WITHCOLONESCAPED}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE}:{SOMEVALUE/;WITHSEMICOLONESCAPED}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE/:WITHCOLONESCAPED}",
    "SOMEKEYWORD;ARG1=MYARG1;TYPE={SOMETYPE};ARG2=MYARG2:{SOMEVALUE/;WITHSEMICOLONESCAPED}"
};
// tried to use the fewest number of capture groups for readability
var regex = new Regex(
    @"
        (
            (TYPE=(?<type>[^;]+);[^:]*?)        
            | 
            (TYPE=(?<type>.*?))
        )?
        :
        (?<value>.*)$
    ",
    RegexOptions.Compiled 
    | RegexOptions.IgnoreCase
    | RegexOptions.IgnorePatternWhitespace
);
foreach (var test in testing)
{
    Match match = regex.Match(test);
    Console.Write(
        "type: [{0}] || value: [{1}]'n",
        match.Groups["type"].Value,
        match.Groups["value"].Value
    );
}

如果案件很重要,请删除RegexOptions.IgnoreCase