正则表达式以任何顺序命名组匹配?

时间:2014-01-18 10:04:09

标签: c# regex

我有以下字符串

"lu=Rg3vHJ; Expires=Tue, 15-Jan-2013 21:47:38 GMT; Path=/; Domain=.example.com; HttpOnly"

我可以使用以下模式获取命名组。

(?<name>.+?)=(?<value>[^;]+)(?:; Expires=(?<expires>[^;]+))?(?:; Path=(?<path>[^;]+))?(?:; Domain=(?<domain>[^;]+))?(?:; (?<httponly>HttpOnly))?(?:; (?<secure>Secure))?
lu (name)
Rg3vHJ (value)
Tue, 15-Jan-2013 21:47:38 GMT (expires)
/ (path)
.example.com (domain)
HttpOnly (httponly)
 (secure)

但是,如果这些组的顺序发生变化,结果将会混乱。 e.g。

lu=Rg3vHJ; Path=/; Expires=Tue, 15-Jan-2013 21:47:38 GMT; Domain=.example.com; HttpOnly"

如何使模式适用于任何组的顺序?

1 个答案:

答案 0 :(得分:1)

您可以使用:

^(?<name>.+?)=(?<value>[^;]+)(?:(?=.*(?:Expires=(?<expires>[^;]+))))?(?:(?=.*(?:Path=(?<path>[^;]+))))?(?:(?=.*(?:Domain=(?<domain>[^;]+))))?(?:(?=.*(?<httponly>HttpOnly)))?(?:(?=.*(?<secure>Secure)))?

regex101 demo

这不是一个美丽的景象,但是诀窍。在这里使用Lookaheads是因为他们没有消耗匹配,因此可以匹配任何前方的任何内容,而不会妨碍其他匹配。

使用多个正则表达式肯定会更易于维护。