我有以下字符串
"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"
如何使模式适用于任何组的顺序?
答案 0 :(得分:1)
您可以使用:
^(?<name>.+?)=(?<value>[^;]+)(?:(?=.*(?:Expires=(?<expires>[^;]+))))?(?:(?=.*(?:Path=(?<path>[^;]+))))?(?:(?=.*(?:Domain=(?<domain>[^;]+))))?(?:(?=.*(?<httponly>HttpOnly)))?(?:(?=.*(?<secure>Secure)))?
这不是一个美丽的景象,但是诀窍。在这里使用Lookaheads是因为他们没有消耗匹配,因此可以匹配任何前方的任何内容,而不会妨碍其他匹配。
使用多个正则表达式肯定会更易于维护。