尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JMeter正则提取器多内容匹配实战:一次提取多个变量与数组遍历
1. 正则提取器的定位与核心思路做接口测试或者性能测试做了几年的朋友应该都有一个共同感受现在的接口越来越“不老实”了。请求参数往往不是写死的常量而是动态生成的。比如登录接口返回一个token随后的下单请求要带着这个token或者列表接口返回一批ID后续的详情查询要从这一批ID里挑一个用。这时候如果你还在手动复制粘贴或者傻乎乎地用固定值跑脚本那基本跑一次挂一次。而JMeter里的Regular Expression Extractor就是专门干这个活的元件。它的本质是从上一个请求的响应报文里用正则表达式把需要的动态值抠出来存到一个变量里供后面的请求引用。这个能力在业内叫“关联”在LoadRunner里叫Correlation在JMeter里就是正则提取器折腾的事。但这个元件有个很有意思的点大家一开始用都觉得简单无非就是写个正则、填个变量名、模板写成$1$。可一旦要一次性从响应里提取多个内容比如一次要拿token、user_id、nickname三个字段或者要从一个JSON数组里把十来个ID全抠出来新手就懵了。网上的教程大多停留在“提取第一个匹配项”这种最简单场景真正涉及多个内容、多个变量、多个匹配的玩法讲得清楚的少。所以这篇我就重点把“正则匹配多个内容”这件事掰开揉碎讲透。包括怎么用多个提取器、怎么用一条正则提取多个字段、怎么用匹配编号取第N个、怎么处理包含多个ID的数组以及匹配不到时的排查套路。照着做基本能覆盖你在JMeter里90%以上的关联需求。2. 一个提取器和一个正则怎么装下多个内容2.1 先把“模板”和“变量名”之间的关系搞清楚正则提取器面板里有几个字段很关键变量名称、正则表达式、模板、匹配编号、缺省值。很多人以为一个提取器只能提取一个内容其实不是一个提取器可以通过括号分组一次提取多个值存到多个变量里。举个例子。假设登录接口返回{code:0,data:{token:abc123def456,user_id:10086,nickname:测试君}}我想把token、user_id、nickname三个值都拿下来。正则表达式可以写成token:([^]),user_id:(\d),nickname:([^])变量名称填token_id_nickname注意这个写法多个变量名用英文半角逗号分隔。对应关系是第一个括号捕获的内容存到第一个变量名token里第二个括号的内容存到id里第三个存到nickname里。模板字段填$1$,$2$,$3$也就是说模板里的$1$、$2$、$3$分别对应正则表达式里的第1、第2、第3个括号捕获组。这个映射关系是理解多内容提取的核心很多人在这一步搞反以为模板只要写一个$1$就行结果第二个第三个变量永远是空的。匹配编号这里先不管多个结果的情况默认填1表示取第一个匹配到的结果。用Debug Sampler打开一看你会得到tokenabc123def456 id10086 nickname测试君一次提取三个变量全部到手后面的请求直接引用${token}、${id}、${nickname}就完事。这是“一条正则提取多个字段”的基本玩法。不过有个前提我得说清楚这种方式依赖正则里分组的顺序且响应体的字段顺序必须和你的正则完全一致。如果后端哪天调整了字段顺序比如token和user_id换个位置你的正则就废了。所以它更适合响应结构稳定、字段顺序固定的内部接口如果你面对的是第三方开放平台的接口字段乱序是常态我建议还是用多个提取器分开写或者干脆用JSON Extractor这种更健壮的方式。2.2 名副其实多内容写多个提取器各取所需除了在一个正则里用多个分组另一种更常见的“匹配多个内容”其实是响应里有多段各自独立的信息你分别把它们提取出来。比如响应长这样{code:0,data:{token:abc123,refresh_token:ref456}}一个提取器拆token另一个提取器拆refresh_token两个互不干扰。这种方式的好处是隔离性强——某个正则写错了只影响它自己不会连带其他变量取不到值。但提取器一多管理上就要注意命名规范。我见过有同事把提取器命名为“Extractor1”“Extractor2”“正则11”这种毫无辨识度的名字后边脚本一复杂想改个正则都找不到对应的是哪个。我的习惯是提取器名称就按“变量名_提取器”的格式命名比如token_extractor、refresh_token_extractor同时在注释里写上提取的是哪个接口的哪个字段。遇到几百个线程一起压测的时候你回来维护脚本会感谢自己当时的这个习惯。2.3 “匹配编号”决定你要第几个匹配结果前面说的都是“匹配到第一个结果就收工”。但实际场景里经常遇到响应里同一个模式出现多次的情况。比如商品列表接口返回{list:[{id:101},{id:102},{id:103},{id:104},{id:105}]}我想从这5个ID里拿第3个来用。正则写成id:(\d)匹配编号填3模板填$1$变量名填goods_id。提取到的就是103。如果匹配编号填0JMeter会从所有匹配里随机取一个。这个特性在性能测试里挺有用——模拟不同用户拿到不同ID更贴近真实场景。匹配编号填-1则是把全部匹配存成一个数组变量名后面会自动加_matchNr表示匹配总数比如goods_id_matchNr5然后goods_id_1到goods_id_5分别就是101到105。这里要特别注意把匹配编号填-1去提取多个值变量引用方式不是直接${goods_id}而是${goods_id_1}这种带下标的。如果你要循环遍历这5个ID去逐个请求可以用循环控制器配合计数器每次用${__V(goods_id_${i})}动态拼变量名这是另一个常用套路后边有机会单独写一篇。2.4 缺省值不是随便填的缺省值这个字段很多人忽略或者随便填个“null”。这里我得纠正一个误区缺省值的作用是“匹配失败时给变量的兜底值”它直接影响你后续请求失败时能不能快速定位问题。如果你不填缺省值正则匹配不到时变量不会被创建。你在后面的请求里用${token}JMeter会原样把${token}当字符串发出去接口那边大概率返回“token不合法”你排查问题时会一脸懵不知道到底是提取失败还是接口真出错了。如果你填了缺省值比如NOT_FOUND那么提取失败时变量值为NOT_FOUND请求参数里会出现这个值通过日志或请求数据你能一眼看出来是提取环节出了问题。但这个值不能乱填如果你填了个空字符串那跟没填差不多反而更隐蔽。我通常的做法是缺省值填ERROR_TOKEN_NOT_FOUND这种带语义的字符串方便日志检索。调试阶段排查问题时特别好用。3. 正则语法与边界表达决定能否稳定匹配的关键正则提取器本质是个正则表达式引擎它懂正则但不懂HTTP、不懂JSON。很多人提取失败不是因为JMeter不会用而是正则写得太糙。3.1 表达式里最简单的就是精确串、任意字符和分组先帮新手捋一遍最常用的几个符号.匹配任意单个字符换行符除外。*前面的表达式出现0次或多次。前面的表达式出现1次或多次。?前面的表达式出现0次或1次同时它是非贪婪匹配的关键。()分组捕获把括号内匹配到的内容单独存下来。[]字符集比如[a-z0-9]匹配一个小写字母或数字。\d匹配一个数字等价于[0-9]。\w匹配字母数字下划线。在JMeter里常用的提取token的正则写法是token:([^])这个写法的高明之处在于用[^]表示“匹配一个或多个不是双引号的字符”。意思是遇到token:之后尽可能多地抓字符一旦碰到下一个双引号就停下来。这样不管token是纯数字、字母、还是带横线和下划线都能完整抓到不会被引号截断。如果你写的是token:(.)问题就来了。是贪婪的它会一直抓到这一行最后一个双引号为止。如果JSON里token后边还有别的字段(.)会把后边所有东西都吞进去提取结果变成abc123,user_id:10086,nickname:测试君这种怪东西。所以记住一个口诀提取JSON里某个字符串类型的值优先用([^])提取数字类型的值用(\d)。3.2 边界把握从“上一个字段末尾”到“下一个字段开头”有时候响应内容比较乱比如span classid101/spanspan classid102/span你直接写span classid(\d)/span配合匹配编号取第N个就能稳定拿到编号。但更常见的是响应里同一字段名出现在脚本、日志、隐藏域等多个位置正则容易误匹配到错误的位置。这时候就需要把“左边边界”写得更具体一点。比如某个页面上有订单号order_no出现在三处一处是页面标题一处是JS变量一处是表格里的链接。你要的是表格链接里那个那就写到链接级别href/order/detail/(\d)这样正则就不会被标题或者JS变量干扰。左边边界越长越具体匹配的精准度越高代价是稍微脆弱一点——后端改了路径格式正则就失效。这个平衡需要根据接口稳定性来取舍。我的经验是稳定的内部系统边界写死一点经常变动的前端页面边界写得宽松一点。3.3 非贪婪匹配到底怎么写才有效很多人写正则喜欢在.*后面加个问号写成.*?用途是让匹配在第一次遇到右边界时就停下。比如remark:hello,token:abc你想从remark里提取hello。写成remark:(.*),token匹配结果可能是hello,token:abc这种乱七八糟的东西。改成remark:(.*?),就会在第一个,处停下拿到干净的hello。但.*?在JMeter里有个坑如果右边界出现多次它取的是最近的那个但左边界它不会自动选择最近的。打个比方内容是这样的A1,B2,A3,B4你要提取第一个B后面的值正则A(.*?),B匹配到的是A1开头的这段取到1没问题。但如果你把坐标对准第二个A还是会被贪婪控制。解决方法是非贪婪匹配写好后用Debug Sampler多看几次结果。正则提取器不像代码调试有断点最快的办法就是把匹配结果直接打印出来肉眼确认。JMeter里正则写错了不会报错它只会安安静静给你一个空值这是最坑的地方。4. 多内容提取实操场景从登录到列表再到下单一条链路全串起来4.1 场景一登录接口提取token 用户ID 用户名先说一个最常见的场景登录后拿token和其他用户信息再走后续业务流程。登录接口返回{ code: 0, message: success, data: { access_token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9, user: { user_id: 894213, nickname: 社区用户小A, avatar: http://example.com/avatar/894213.png } } }我的做法是放两个正则提取器而不是硬塞一个正则。第一个提取器匹配access_token变量名auth_token正则access_token:([^])模板$1$匹配编号1缺省值TOKEN_NOT_FOUND第二个提取器匹配user_id变量名uid正则user_id:(\d)模板$1$匹配编号1缺省值UID_NOT_FOUND为什么不合成一个正则因为实际接口返回体里token和user_id之间隔着很多字段如果你写一条特别长的正则一旦中间有字段值变化比如nickname里有特殊字符、换行整条匹配就失败两个变量一起丢。拆成两个提取器后token匹配失败只影响tokenuser_id还能正常提取容错性更好。在后续请求中HTTP Header管理器里加一个Authorization参数值填Bearer ${auth_token}请求体里带${uid}。这样登录态就完整串起来了。4.2 场景二从列表接口一次性拿多个ID分别构造多条请求列表接口返回{code:0,data:{list:[{id:1001,title:文章A,status:1},{id:1002,title:文章B,status:1},{id:1003,title:文章C,status:1}]}}我的目标是把这3个文章ID都提取出来然后分别对这3个ID发起详情查询。正则提取器配置变量名article_id正则id:(\d)模板$1$匹配编号-1缺省值ID_NOT_FOUND匹配编号-1意味着把所有匹配到的ID都存成数组。运行后你会得到article_id_matchNr3 article_id_11001 article_id_21002 article_id_31003接下来在循环控制器里设置循环次数为3在循环内部用${__intSum(${__counter(FALSE,)}-1,1,)}或者直接配合计数器元件获取当前第几轮然后用${__V(article_id_${index})}引用对应ID。这里要提醒一个点article_id_matchNr这个变量非常有用。你可以在循环控制器的循环次数里直接填${article_id_matchNr}这样列表返回多少个ID循环就跑多少次完全动态适配不用手工改循环次数。这是做参数化遍历的核心技巧实测在压测场景里配合线程组特别好用。4.3 场景三跨线程组传递多用户token压测场景里经常需要多个用户同时登录然后用各自的token去发请求。这时候线程组2要引用线程组1里某次登录得到的token不能直接用${token}——线程组之间的变量默认是不共享的。我的解决办法是登录请求放在线程组1用正则提取器提取token后通过${__setProperty(token_${i}, ${token},)}或直接用BeanShell/JSR223取样器把变量转成JMeter属性这样线程组2里就能用${__P(token_1,)}来引用。结合${token_matchNr}遍历登录用户数把每个用户的token都存成独立属性后边线程组就能按索引模拟不同用户的操作了。4.4 场景四正则提取器与JSON提取器怎么选正则匹配多个字段虽然能搞定大部分场景但面对JSON响应其实JMeter还提供了JSON ExtractorJSON Path Extractor。很多新手会问到底用哪个。我的判断标准很简单响应是标准JSON格式且字段名明确——优先用JSON Extractor表达式如$.data.list[0].id更直观、更不容易写错还天然支持多层嵌套和数组下标。响应是HTML、文本、或者JSON格式不规范比如有的接口返回字段名带前缀、带注释——用正则提取器。响应体里既有JSON又有非JSON内容比如混合报文——正则提取器更灵活。要从一个JSON数组里取全部ID并遍历——两者都能做但正则写法更短id:(\d)一条搞定JSONPath要写$.data.list[*].id再配合matchNr机制反而绕。如果团队其他人维护脚本时更熟悉JSONPath那就选JSON提取器降低维护门槛。如果是自己长期维护的压测脚本顺手用哪个都行关键是稳定。5. 实操过程从写正则到验证结果一步步排雷5.1 第一步先用“查看结果树”拿到原始响应所有提取得以进行的前提是你的取样器确实拿到了完整响应。很多人上来就写正则也不看响应长什么样结果正则当然写不对。在取样器下加一个“查看结果树”监听器先跑一次请求切到“响应数据”或者“JSON Path Tester”页签肉眼确认响应内容。重点看响应里是否有换行如果整个JSON被压缩成一行正则里的点号才能跨字段匹配。字段名是单引号还是双引号缺引号还是多引号。值里有没有空格、转义符、特殊字符。响应被截断没有比如Gzip没解压截断了看尾部内容。这些细节直接影响正则写法。比如字段名是单引号你的正则就写token:([^])别死磕双引号版本。5.2 第二步正则表达式调试的正确姿势正则提取器没有单独的正则调试面板但可以利用“正则表达式测试器”在查看结果树里选中某个取样器的响应切换到“正则表达式测试器”页签输入你的正则它会即时显示所有匹配结果以及分组取值。这一步强烈建议养成习惯每次写完正则先在这个页签里验证确认捕获组正确、匹配数量符合预期再到提取器里填写详细配置。别直接写进提取器就开跑匹配失败的排查成本远高于多验证这一次。5.3 第三步用Debug Sampler确认变量结果正则提取器执行后变量是否生成、值是否正确肉眼看不到。加一个Debug Sampler监听器勾选“JMeter Variables”运行后就能看到所有变量列表包括token、token_matchNr、token_1等。这一步能发现一个很隐蔽的问题变量名写错了。比如提取器里变量名填auth_token但后续请求里引用了${token}Debug Sampler里看半天也找不到问题因为你一直盯着token这个变量名。核对变量名时直接把Debug Sampler输出贴到一个文本编辑器里搜索最快。5.4 第四步在后续请求里验证引用是否生效这一步常被忽略。正则在提取器里取了值Debug Sampler也看到变量有值但后续请求的请求体里到底有没有成功替换成变量值还得看“查看结果树”里的请求数据。比如后面有个请求请求体是{uid:${uid},nickname:${nickname}}查看结果树里应该看到{uid:894213,nickname:社区用户小A}这种被替换后的真实数据。如果你看到${uid}原封不动留在请求体里说明变量在上下文中不可见。典型的上下文问题是提取器放在错误的作用域比如放在了循环控制器外边而后续请求在循环里边变量作用域覆盖不到。6. 踩坑实录那些年正则提取器教给我的教训6.1 匹配总是不成功先查特殊字符响应内容里如果包含\n换行符、\t制表符、Unicode转义\uXXXX你的正则在文本视图中看着对得上号但实际匹配时会因为字符不连续而导致失败。比如JSON响应里有avatar:http:\/\/example.com\/avatar\/1.png注意反斜杠转义了斜杠你的正则如果写avatar:(.)匹配出的结果会带着转义符需要在后续请求里做转义处理或者用${__unescapeHtml4()}处理。这种问题不仔细看响应原文很难发现。6.2 匹配到的值带空白字符有时响应里的值后边有空格比如token:abc123右引号前有空格。正则token:([^])匹配到的是abc123后面带着空格。请求头里带着空格接口可能不认导致鉴权失败。处理方式是正则里加个\s*把空白吃掉token:\s*([^]?)\s*或者在后续请求里用${__trim(${token},)}做裁剪。我通常是在正则里把边界写紧少依赖后处理。6.3 多个正则提取器之间不要互相依赖我看到有同事把提取器串起来用比如提取器A的返回值作为提取器B正则的一部分。这种设计非常脆弱一旦A没匹配到B一定失败且排错时还得层层往上查。建议是每个提取器尽量独立如果确实存在依赖用断言或条件判断把失败情况及早暴露别让错误静默流向下游请求。6.4 线程组并发时的变量覆盖在压测场景里同一线程组内如果多个线程同时执行每个线程都有自己独立的变量副本不会互相覆盖。但如果你用了“共享模式”的变量操作比如通过${__setProperty}把变量写入JMeter属性那属性是全局共享的线程1写入的属性可能被线程2覆盖。所以多线程取token存属性时一定要带上线程编号或用户编号做区分比如token_${__threadNum}否则高并发下所有用户拿到的都是同一个token压测场景就失真了。6.5 正则表达式里的中文字符响应里如果包含中文比如nickname:社区用户小A正则nickname:([^])可以正常匹配到中文。但如果你用.而不是[^]去匹配某些编码下.匹配中文可能出问题取决于JMeter运行环境的区域设置和响应编码。稳妥做法是用[^]或[\u4e00-\u9fa5\w]这种明确字符集。响应编码这里也有坑如果接口返回GBK编码JMeter默认UTF-8解码会乱码正则自然匹配不上这时要在取样器里设置编码或处理后端响应头。7. 我的几条实操经验总结写这部分时我想按“工具选型原则”“脚本维护习惯”“调试排错效率”三个维度把多年跑下来的核心经验浓缩成几条每一条都是踩坑踩出来的。7.1 坚持“先看响应再写正则”这是我反复强调但依然有人不听的规矩。任何一次正则匹配失败第一步都应该是回看响应原文而不是改来改去试运气。响应原文能暴露90%以上的问题编码不对、字段顺序变了、值里有换行、响应被截断、响应本身报错——这些从正则本身是看不出来的。我见过有人花一上午在那儿调正则最后发现接口压根没通返回的是错误提示页。7.2 正则提取器与断言搭配使用正则提取器匹配失败时默认不会让请求失败后续请求拿着缺省值或者空变量继续跑最终报错时很难追溯到根因。我的习惯是在提取器后面加一个响应断言检查提取的关键变量是否等于预期的非空值。比如断言${token}不等于TOKEN_NOT_FOUND一旦断言失败JMeter会标记取样器失败脚本执行流程会提前暴露问题。这在压力测试长跑任务中尤其重要——任务跑了一夜早上看结果时如果全是成功但变量全是空的那这个压测数据等于白跑了。7.3 写好变量命名规范和注释回看不迷路接口多了以后提取器就是一片野草。我主导的项目里会定一条硬规则正则提取器名称统一以“提取目标_来源字段_Extractor”命名比如token_登录接口_Extractor。并在提取器上方的“注释”里写明这个变量是哪个接口的哪个字段、后续在哪些请求里被引用、匹配失败时的缺省值含义。三个月后你再回头维护这些脚本会感谢当年自己留了这些信息。7.4 能用后处理解决的不塞进正则正则表达式写得太复杂维护成本呈指数上升。我见过一条五六十字符的长正则就为了提取一两个字段后来后端接口换了个字段名改正则的人理了半天才算理明白。能用多个简单提取器解决的问题就不要追求一条正则炫技。能用JSON提取器解决的JSON场景就不要死磕正则。工具的目的是稳定提取不是为了展示正则功底。7.5 关闭不需要的正则提取器以免性能损耗压力测试中正则提取器本身有开销。如果脚本里有几十个提取器每个提取器都要对完整响应做正则编译和匹配这在百万级请求压测下会拉高CPU使用率。长期稳定运行的压测脚本建议把不需要的提取器禁用掉或者把不常用的正则表达式预编译好。Debug Sampler、查看结果树这类监听器在压测时也要移除或禁用它们的内存开销比提取器还猛跑大了容易撑爆JMeter堆内存。7.6 正则表达式里的陷阱优先级先解决转移字符再解决贪婪匹配很多人在正则提取器里犯的错80%集中在这两个点一是转义字符不对二是贪婪与非贪婪用错。转义字符的坑在于响应里出现了\/表示斜杠但你正则里写的是/贪婪匹配的坑在于后边多个字段把值吞长了。这两个问题排查时优先检查能省不少时间。8. 从“会用”到“用得稳”正则提取器进阶思路正则提取器本身不难难的是“稳”。所谓稳就是不管接口返回什么变体都能准确地把目标值提取出来。8.1 拥抱组合式提取我现在的项目里几乎不会让一条正则承载所有提取需求。而是在登录这个取样器后面挂两三个提取器一个提取token一个提取user_id再用一个JSON提取器去拿用户信息里的某个嵌套字段。三个提取器互不影响任何一个挂了其他的还能正常工作。组合式提取还有另一个好处可以把“提取”和“校验”分开。比如第一个提取器只负责提取第二个断言专门校验关键变量功能单一出问题时定位也快。8.2 善用JMeter内置函数与正则结合有时提取出的值需要进一步处理比如去掉空格、URL解码、转小写。JMeter内置函数里${__trim()}、${__lowercase()}、${__urlencode()}都很有用。组合起来就是一次完整的数据加工链正则提取原始值 → 内置函数清洗 → 赋值给最终变量 → 后续请求引用。这个套路在对接外部平台时尤其好用因为外部平台的token经常需要二次编码。8.3 压测脚本要常做“空跑”验证我接手过一份压测脚本看配置一切正常但跑起来所有请求都是401。最后定位发现登录接口返回的token字段名在测试环境是access_token在压测环境是token正则提取器写的是测试环境的字段名压测环境直接匹配失败。所以脚本换环境跑之前一定要先做一次“单线程单请求空跑”用查看结果树确认每个提取器的变量都有值再拉高并发。这个步骤虽然啰嗦但能避免压测跑半天、数据全部无效的惨剧。8.4 把正则提取器做成模板化资产如果你的团队经常做接口测试项目可以把常用接口类型登录、列表、详情、下单对应的正则提取器配置整理成一套模板。新项目接入时复制模板框架只改响应解析部分的正则表达式能大幅缩短脚本准备时间。我在团队里就是这么做的效果很好。模板里除了提取器配置还包括了断言模板、缺省值规范、变量命名规范、Debug验证清单。这些小细节累积起来就是团队压测效率的硬实力。从“正则匹配多个内容”这个小切口挖下去你会发现关联这东西渗透到脚本设计的每个角落。别指望一个元件解决所有问题更重要的是沉淀一套自己用着顺手、排查不费劲的脚本组织方式。下次遇到提取不到值先按我这篇文章里的排查链路走一遍看响应、验正则、查变量、看引用、查上下文作用域九成问题当场就能解决。剩下那一成大概率是编码和字符集的问题——把响应原文打印出来看一眼答案就已经在里面了。
RELATED

相关推荐

Muse Gadgets:面向物理Agent的轻量级AI硬件设计与落地实践

Muse Gadgets:面向物理Agent的轻量级AI硬件设计与落地实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/13 1:16:39
51单片机流水灯实战:IO控制、延时精度与硬件驱动详解

51单片机流水灯实战:IO控制、延时精度与硬件驱动详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/13 1:16:39
EMC标准分类全解析:通用标准与产品族标准选用指南

EMC标准分类全解析:通用标准与产品族标准选用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/13 1:16:39
MORE NEWS

更多资讯

📰

Spring Formatter深度解析:双向格式化与国际化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MongoDB命令行实战:mongosh高频操作与性能排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Nginx配置:root与alias的区别与404排错实践

前段时间帮朋友排查一个 Nginx 配置问题:应用已经上线,接口返回正常,偏偏所有静态资源 404。配置文件从头到尾翻了两遍,问题就出在location块里到底用root还是alias。这种困惑几乎每个接触 Nginx 配置的人都会遇到,网上…

📰

从jQuery到Vue.js:零基础入门到独立开发管理后台的实战指南

三年前我还在用jQuery给公司官网切页面,每天的工作就是翻着PHP模板找变量、在三千行的script标签里小心翼翼地改动一个按钮事件。现在我已经能独立完成一个包含用户登录、数据看板、订单管理的中型管理后台,而且它已经在生产环境稳定跑了三个多月。这期间…

📰

纯Java构建Agent Harness:企业级AI Agent治理与工程实践

1. 为什么是 Agent Harness,为什么是纯 Java1.1 Harness 和 Framework 的边界先回答一个我几乎每次分享都会被问到的问题:Agent Harness 和 Agent Framework 到底有什么区别。框架给你的是轮子、发动机、方向盘这些零件,你自己决定怎么把它们…

📰

ComfyUI模特姿势更换实战:DWPose骨架迁移与IPAdapter外观一致性控制

简介:这份资源是面向Stable Diffusion用户与图像生成爱好者的ComfyUI模特姿势更换项目源码,适合希望借助节点式工作流快速完成人物姿态调整的设计师、电商美工及数字艺术创作者。压缩包共3个文件,以inscode工程配置、html页面与gitignore忽略…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬