用于匹配非转义字符的正则表达式
本文关键字:正则表达式 转义字符 用于 | 更新日期: 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
。