如何用正则表达式将指定HTTP请求字符串分割为请求组?
嘿,我来帮你搞定这个正则提取请求单元的问题!首先得说你之前的正则为啥没成功——一是你加了\n换行符,但你的输入其实是单行字符串,这直接导致匹配不上;二是没处理JSON里的嵌套大括号,贪婪匹配会提前在第一个闭合括号就终止,拿不到完整的请求。
下面给你分情况提供可行的正则方案:
1. 支持嵌套大括号的通用方案(PCRE兼容)
如果你的工具/语言支持PCRE语法(比如VS Code、PHP、Perl,或者Python用第三方regex库),这个正则可以完美处理嵌套的JSON结构:
(GET|PUT|POST|DELETE)\s+\/\S+\s+\{(?:[^{}]|(?R))*\}
正则拆解:
(GET|PUT|POST|DELETE):精准匹配HTTP请求方法\s+\/\S+:匹配请求路径(空格开头,后面跟非空白的路径字符)\s+\{:匹配请求体前的空格和左大括号(?:[^{}]|(?R))*:核心部分——匹配任意非大括号字符,或者递归匹配整个括号内的内容,完美处理嵌套的大括号\}:匹配闭合的右大括号
用这个正则匹配你的输入字符串,会精准提取出三个完整的请求单元:
GET /bar { "limit": { "foo": 1 } }GET /barfoo { "limit": { "foo": 1 } }GET /fuzz { "limit": 1 }
2. Python标准库适配方案
Python自带的re模块不支持递归匹配,这时候可以安装第三方的regex库(pip install regex),然后用下面的代码提取:
import regex input_text = 'GET /bar { "limit": { "foo": 1 } } GET /barfoo { "limit": { "foo": 1 } } GET /fuzz { "limit": 1 }' pattern = r'(GET|PUT|POST|DELETE)\s+\/\S+\s+\{(?:[^{}]|(?R))*\}' # 获取所有完整匹配 full_matches = [match.group(0) for match in regex.finditer(pattern, input_text)] print(full_matches)
运行后就能得到三个完整的请求单元列表。
3. 无嵌套场景的简化方案
如果你的请求体里永远不会有嵌套大括号,也可以用这个更简单的正则(但不推荐用于有嵌套的情况):
(GET|PUT|POST|DELETE)\s+\/\S+\s+\{[^{}]*\}
内容的提问来源于stack exchange,提问作者jesusgn90
相关产品推荐
相关产品推荐

