【问题标题】:Regular expression named group match in any order?以任何顺序命名组匹配的正则表达式?
【发布时间】:2025-12-01 23:35:01
【问题描述】:

我有以下字符串

"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))?
陆(姓名) Rg3vHJ(值) 2013 年 1 月 15 日星期二 21:47:38 GMT(到期) / (小路) .example.com(域) HttpOnly (httponly) (安全的)

但是,如果这些组的顺序发生变化,结果就会变得混乱。例如

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

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

【问题讨论】:

  • 为什么不使用多个正则表达式呢?

标签: c# regex


【解决方案1】:

你也许可以使用:

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

regex101 demo

这不是一个漂亮的景象,但可以解决问题。此处使用了前瞻,因为它们不消耗匹配项,因此可以匹配前面任何位置的任何内容,而不会妨碍其他匹配项。

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

【讨论】:

    最近更新 更多