我需要正则表达式匹配关键字的VALUE和可选的TYPE,其中可能的条件如下。
在下面的例子中,我用曲线括起了我需要捕捉的字段。 SOMEVALUEXXX总是应该在那里,尽管可能有极少数情况下值是空/空字符串。 TYPE = XXXX是可选参数,可能不存在。
我能够产生的最接近的正则表达式如下:^ANNIVERSARY(?:(?::)|(?:;.*:))([^:]*)$
将捕获ANNIVERSARY的值,但是当有一个转义冒号时{(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
。