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

时间:2016-02-05 14:57:35

标签: c# regex

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

在下面的例子中,我用曲线括起了我需要捕捉的字段。 SOMEVALUEXXX总是应该在那里,尽管可能有极少数情况下值是空/空字符串。 TYPE = XXXX是可选参数,可能不存在。

我能够产生的最接近的正则表达式如下:^ANNIVERSARY(?:(?::)|(?:;.*:))([^:]*)$将捕获ANNIVERSARY的值,但是当有一个转义冒号时{(1}}将无法执行此操作})在值。

/:

1 个答案:

答案 0 :(得分:1)

保留花括号以进行演示,但即使被移除也会产生预期效果:

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