如何用正则匹配Host与User-Agent且不区分二者出现顺序?
正则匹配相邻但顺序不定的Host和User-Agent值
需要解析Host和User-Agent的对应值,二者始终相邻但顺序不固定(可能Host在前,也可能User-Agent在前),要求避免使用Regex1|Regex2这类重复正则的写法,此前尝试正向预查未成功。
示例内容
示例1
Word1 Host:10.1.1.2 User-Agent: Microsoft Office/16.0 (Windows NT) Word2
示例2
Word1 User-Agent: Microsoft Office/16.0 (Windows NT) Host:10.1.1.2 Word2
当前正则代码
([^H]*(?:H(?!ost:)[^H]*)*Host:(?<IP>[^\]*)\)([^U]*(?:U(?!ser-Agent:)[^U]*)*User-Agent:(?<UserAgent>[^\]*)\)
解决方案
可以结合正向预查和重复匹配组实现无需重复正则的写法,兼容两种顺序的匹配:
(?=.*Host:)(?=.*User-Agent:)(?:(Host:(?<IP>\S+)|User-Agent:(?<UserAgent>.+))\s*){2}
正则说明
- 正向预查校验:
(?=.*Host:)和(?=.*User-Agent:)确保文本中同时存在两个目标关键字,避免匹配不完整的情况。 - 重复匹配逻辑:
(?:(Host:(?<IP>\S+)|User-Agent:(?<UserAgent>.+))\s*){2}重复两次匹配单元,每次匹配其中一个关键字及其对应值,\s*匹配关键字之间的空白(包括换行),自然兼容两种顺序。 - 命名捕获组:
(?<IP>\S+)捕获Host的IP值(\S+匹配非空白字符,若Host值含空白可替换为[^\n]+匹配整行内容),(?<UserAgent>.+)捕获User-Agent的完整值。
适配调整
- 若需严格匹配相邻两行(排除中间空白行),可将
\s*替换为\n。 - 若目标值格式特殊,可针对性调整捕获组内的匹配规则(比如IP可替换为
\d+\.\d+\.\d+\.\d+做精准匹配)。
内容的提问来源于stack exchange,提问作者moody
相关产品推荐
相关产品推荐

