news 2026/11/5 16:50:22

Excel VBA正则表达式实战:文本清洗与数据提取

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Excel VBA正则表达式实战:文本清洗与数据提取

1. 项目概述:从Excel的"文本替身"到真正的"文本手术刀"

拿Excel干活的人,早早晚晚会撞上这么一堵墙:手里的表格有一列数据,格式乱七八糟,有的是"2023-01-05",有的是"2023/1/5",还有"20230105";有的单元格里混着电话号码和备注文字;有的需要从一大段描述里把订单编号、金额、日期全部抠出来。你当然可以用Excel自带的查找替换、分列、Left/Mid/Right函数去慢慢磨,一次两次还行,数据量一大、规则一复杂,这活儿就变成了纯体力活,而且极易出错。

我在处理几百行客户留言记录、从网页导出的HTML源码、或者系统导出的日志文件时,第一次体会到了正则表达式的威力。它就是那把真正意义上的"文本手术刀"——不是靠固定的位置去切,而是靠"模式"去匹配。你告诉它"我要找的是以字母A开头、后面跟着5到8位数字的内容",它就能在一万行文本里精准地把所有符合条件的片段全部拎出来,你甚至不用告诉它具体是第几个字符。

这一章咱们要搞定的是在Excel VBA里用正则表达式处理文本。学完你就能在Excel里写出自己的"智能提取"工具,什么手机号清洗、身份证号校验、金额标准化、日志信息拆解,都不在话下。这篇博文适合那些已经会写简单VBA宏、能看懂For循环和If判断的读者,同样的,如果你Excel函数玩得溜但对编程有点犯怵,这篇文章也带你一步步踩进正则的门槛。

先剧透一下核心要点:VBA本身没有内置正则功能,但可以通过定义RegExp对象调用正则引擎;正则表达式有自己的一套"语法"——字符类、量词、分组、断言;在实际落地时,匹配、提取、替换、校验四类操作各有各的坑。接下来咱们把这四件事挨个拆开揉碎讲明白。

2. 正则表达式的核心原理与VBA中的实现方式

2.1 告别?:VBA里为什么一定要用RegExp对象

很多人在Excel里做过"通配符查找",比如用*代表任意一串字符,用?代表单个字符。这在简单场景下够用,但它有致命的短板——"任意字符"太笼统,你没法表达"必须是数字"、"必须是字母"、"重复2到5次"这类精确规则。正则表达式(Regular Expression)解决的就是这个问题:它用一整套字符和特殊符号,把"什么样的文本符合规则"描述得精确到每一个字符。

VBA里使用正则,全靠"Microsoft VBScript Regular Expressions 5.5"这个库。引用它的方式有两种:

  • 在VBA编辑器里,菜单"工具→引用",勾选Microsoft VBScript Regular Expressions 5.5,这样在代码里可以直接声明Dim reg As New RegExp。
  • 不勾选引用的话,也可以用CreateObject("VBScript.RegExp")在运行时创建同一个对象。

第二种方式有个好处:代码复制到别的电脑上不会因为引用丢失而报错,WPS的VBA环境也兼容。我在给同事写工具的时候,习惯用CreateObject("vbscript.regexp"),省得发出去的excel文件在别人机器上打开时弹一个"找不到工程或库"的红叉。

RegExp对象的几个核心属性和方法,先过一遍:

  • Pattern:正则表达式模式字符串,这是整个正则的核心。
  • IgnoreCase:布尔值,是否忽略大小写,默认是False,表示区分大小写。
  • Global:布尔值,是否在整个字符串里全局匹配,默认是False,表示只找第一处匹配。这里我踩过一个大坑,后面细说。
  • MultiLine:布尔值,是否把^和$视为每一行的行首行尾,而不是整个字符串的开头结尾。处理多行文本时这个属性很关键。
  • Test():返回布尔值,表示字符串是否能在任意位置匹配上模式。
  • Execute():返回MatchCollection对象,包含所有匹配到的Match对象。
  • Replace():按模式做替换,做文本清洗最常用。
  • SubMatches:通过Matches集合里的SubMatches集合,拿到分组捕获的内容。

2.2 从零读懂正则符号:字符类、量词、分组与断言

正则的语法符号就那么二十来个,但组合起来千变万化。初学阶段,你最需要吃透的是下面这几类。

**第一类,字符类型符号。**用来描述"这个位置是什么类型的字符":

  • \d:任意一个数字,等价于[0-9]。
  • \D:任意一个非数字。
  • \w:任意一个"单词字符",包括字母、数字、下划线。
  • \W:任意一个非单词字符。
  • \s:任意一个空白字符,包括空格、制表符、换行等。
  • \S:任意一个非空白字符。
  • .:任意一个字符(换行符除外,除非开了特殊模式)。

比如要匹配一个手机号,1[3-9]\d{9}就是"以1开头,第二位是3到9之间的数字,后面紧跟9个数字"。

**第二类,量词。**描述"前面的字符要出现多少次":

  • *:0次或多次。
  • +:1次或多次。
  • ?:0次或1次。
  • {n}:恰好n次。
  • {n,}:至少n次。
  • {n,m}:n到m次。

量词默认是"贪婪"的,它会尽可能匹配更长。比如在"abc123def456"里用\d+匹配,会先把123整个吃掉,再把456整个吃掉。如果你想要"非贪婪"——即最小匹配,就在量词后加个问号,比如\d+?会让它每次只匹配一个数字。这个细节在做HTML标签提取时特别重要,后面会看到。

**第三类,分组与引用。**用圆括号()把一段表达式包起来,既能把一整串规则当作一个整体用量词修饰,又能把匹配到的子内容单独捕获出来。比如(\d{4})[-/.](\d{1,2})[-/.](\d{1,2})可以把日期里的年月日分别抓出来,放进SubMatches集合。

分组还有"非捕获分组"(?:...)的写法,表示只分组但不捕获内容。在VBA里,如果你不需要从SubMatches里取值,用非捕获分组能提升一点点性能,也避免分组索引乱掉。

**第四类,边界与断言。**这类符号不消耗字符,只是标记位置:

  • ^:字符串(或行)的开头。
  • $:字符串(或行)的结尾。
  • \b:单词边界。
  • (?=...):正向先行断言,表示后面必须跟指定的内容,例如\d+(?=元)只匹配后面带"元"字的数字。
  • (?<=...):正向后行断言,表示前面必须是指定内容,例如(?<=¥)\d+只匹配人民币符号后面的数字。

在VBA的VBScript正则引擎里,后行断言(?<=...)是不支持的,这一点必须提醒大家。前面查了一下,VBScript正则引擎不支持正向后行断言,这是一个很坑的限制。比如你想提取价格:123元里的纯数字,直接用(?<=价格:)\d+在别的地方可能没问题,但在VBA里会直接报错。替代方案是:把整段匹配出来,再用分组捕获,比如价格:(\d+)元,取SubMatches(0)。这是VBA正则的一个高频坑,先记住它。

3. 实操之前的环境准备与工具选型

3.1 在VBA里正确引用正则库

打开Excel按Alt+F11进入VBA编辑器,在菜单栏选"工具"→"引用",在弹出的对话框里下拉找到"Microsoft VBScript Regular Expressions 5.5"。

我在实际测试中还注意到一个细节:如果你用的是64位Office,这个引用名显示不变,依然可以用。但如果你通过CreateObject方式创建对象,VBA本身不支持CreateObject,每年总有新手在这里翻车——实际上VBA是支持CreateObject的,也支持后期绑定。64位Office下用CreateObject("VBScript.RegExp")在VBA里也能正常创建正则对象。如果你声明的是New RegExp,就必须保证引用勾选上了,否则编译阶段就会提示"用户定义类型未定义"。

为了兼容性和可移植性,我的建议是:开发调试时用前期绑定(勾选引用),享受代码提示;最终交付时改成后期绑定(CreateObject),并把代码里的对象显式声明为Object类型。这样在WPS和不同Office版本之间复制代码都不容易出幺蛾子。

还有一个专门的技巧:如果你的Excel文件发给同事,对方打开后"宏被禁用"或者"加载项被禁用",最常见的原因是Excel的安全设置拦截了宏,或者是文件来源被标记为"受信任"。解决办法是把文件放到受信任位置,或者在文件属性里勾选"解除锁定"。我在公司内部发工具时,还习惯再加一段代码,在Workbook_Open事件里主动加上一个欢迎提示,让同事知道宏已经正常启用,省得他们看到Excel打开后没反应以为工具坏了。

3.2 手写第一个正则函数:从"匹配成功"到"提取全部"

我们直接在模块里写一个最基础的正则包装函数,后面所有案例都基于它来扩展。

Function RegMatch(inputStr As String, pattern As String, Optional ignoreCase As Boolean = True) As Boolean Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = pattern reg.IgnoreCase = ignoreCase RegMatch = reg.Test(inputStr) End Function Function RegExtract(inputStr As String, pattern As String, Optional matchIndex As Long = 1) As String Dim reg As Object Dim matches As Object Dim m As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = pattern reg.Global = True Set matches = reg.Execute(inputStr) If matches.Count >= matchIndex Then Set m = matches(matchIndex - 1) RegExtract = m.Value Else RegExtract = "" End If End Function

这两个函数加上之后,你在单元格里可以直接=RegMatch(A1,"\d{11}")判断A1是否包含11位数字,也可以=RegExtract(A1,"1[3-9]\d{9}")把第一个手机号提取出来。

不过这里要说清楚一点:VBA用户自定义函数(UDF)在用正则时,最好把Global属性和IgnoreCase属性都显式设置,不要依赖默认值。我第一次写的时候漏了Global=True,结果Execute只返回了第一个匹配项,那一刻我还以为正则模式写错了,排查了半天。这个教训值得刻在脑子里:正则的每一个属性都要显式声明。

4. RegExp对象三件套:Test、Execute、Replace的实战对比

4.1 Test方法:最快的布尔判断,数据校验首选

Test方法的用途就是返回True/False,它的执行效率非常快,适合在筛选循环里做"是否符合规则"的判断。

案例:判断单元格里是否包含有效的身份证号(这里只说格式,不做校验位计算)。身份证号基本规则是前17位数字,最后一位可能是数字或X:

Function IsIDCard(cellValue As String) As Boolean Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "^\d{17}[\dX]$" reg.IgnoreCase = True IsIDCard = reg.Test(cellValue) End Function

注意我用了^和$,这表示匹配整个字符串从开头到结尾,而不是在中间找。如果你想让它在长文本里也能识别,就别加这两个符号。平时校验身份证、邮箱、手机号这类"整串格式"的,都要记得加^和$,否则"\d{17}[\dX]"在"abc123456789012345Xabc"里也能匹配成功,结果就不对了。

这里有第二个高频坑:在VBA的VBScript正则引擎里,$只匹配字符串的绝对末尾,不会匹配字符串末尾的换行符之前。也就是说,如果单元格内容以换行符结尾,Pattern = "^\d{11}$"可能匹配不上"手机号后面跟着一个换行"的文本。你可以在正则里写成\d{11}\r?$,或者先处理掉尾部的换行Trim。我在清洗从网页复制来的数据时就常常遇到这种情况。

4.2 Execute方法:拿回所有匹配,文本提取的大杀器

Execute返回Matches集合,每个Match对象有Value、FirstIndex、Length三个属性,还能通过SubMatches拿分组内容。

案例:从一段商品描述里提取所有形如"订单号:AB123456"的订单号,但只提取编号部分,不把"订单号:"三个字带出来。正确写法是:

Sub ExtractOrderIDs() Dim reg As Object Dim matches As Object Dim m As Object Dim i As Long Dim cell As Range Dim result As String Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "订单号[::]\s*([A-Z]{2}\d{6})" reg.Global = True For Each cell In Range("A1:A100") Set matches = reg.Execute(cell.Value) result = "" For Each m In matches If result <> "" Then result = result & ";" result = result & m.SubMatches(0) Next m cell.Offset(0, 1).Value = result Next cell End Sub

这里把需要的内容用圆括号包起来,然后通过m.SubMatches(0)取第一组捕获的内容。SubMatches是一个集合,从0开始编号,对应模式里从左到右的第1个括号。

一个小细节:如果你想让正则匹配中文冒号或英文冒号都行,我写成了[::],这在字符类里可以并列多个字符。实际业务数据里中文冒号和英文冒号混用的情况太常见了,这个写法能少掉很多坑。

4.3 Replace方法:不写循环的文本清洗利器

Replace比循环匹配+手工拼接要高效得多,而且很多时候一行正则就能替换掉几十行IF代码。

案例:把整个选区里所有的手机号中间四位打码。

Sub MaskPhoneNumbers() Dim reg As Object Dim cell As Range Dim cellValue As String Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "(1[3-9]\d)\d{4}(\d{4})" reg.Global = True For Each cell In Selection cellValue = cell.Value If VarType(cellValue) = vbString Then cell.Value = reg.Replace(cellValue, "$1****$2") End If Next cell End Sub

Replace方法里的替换文本可以用$1、$2来引用分组捕获的内容。这里$1是前三位(开头的1和第二位数字以及第三位数字),$2是末尾四位,中间四位用星号替换。注意RegExp的替换文本里,$$在VBScript引擎里并不表示字面意义的美元符,如果你想输出一个美元符号,直接用普通字符即可,因为没有特殊的转义需求。这一点和别的语言正则不同,值得留个心眼。

另外,Replace方法还有一个隐蔽特性:如果模式里指定了Global=False,它只替换第一个匹配;Global=True则替换全部。这同样是"显式声明属性"原则的一部分。

5. 正则表达式在Excel中的高频业务场景拆解

5.1 文本清洗:规范化日期、金额、电话号码格式

Excel数据清洗是正则最实用的战场。比如从多个系统导出的日期格式五花八门,有的2023/08/15,有的2023.8.5,还有20230815。如果数据量大,靠分列和函数组合会很痛苦,正则一行就能统一。

Function NormalizeDate(inputStr As String) As String Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "^(\d{4})[./-]?(\d{1,2})[./-]?(\d{1,2})$" reg.IgnoreCase = True If reg.Test(inputStr) Then Dim m As Object Set m = reg.Execute(inputStr)(0) NormalizeDate = m.SubMatches(0) & "-" & Format(m.SubMatches(1), "00") & "-" & Format(m.SubMatches(2), "00") Else NormalizeDate = inputStr End If End Function

这里用[./-]?表示分隔符可有可无,如果没有分隔符就直接是8位数字。注意短横线在字符类里如果放在中间,可能被解析成范围,所以我习惯把它放在字符类的最后[./-],这样它就是字面意义的短横线。这个小知识点是我在写正则时踩过坑总结出来的。

5.2 数据提取:从混合文本中拆出数值、地址、备注信息

我经常用Excel处理订单备注,比如"张三 138****1234 收货地址:北京市朝阳区xxx路1号 备注:工作日送货",需要分别提取姓名、电话、地址。可以分三个正则依次匹配:

Sub ParseOrderNote() Dim inputText As String Dim regPhone As Object Dim regAddr As Object Dim matches As Object inputText = Range("B2").Value Set regPhone = CreateObject("VBScript.RegExp") regPhone.Pattern = "1[3-9]\d{9}" Set matches = regPhone.Execute(inputText) If matches.Count > 0 Then Range("C2").Value = matches(0).Value Set regAddr = CreateObject("VBScript.RegExp") regAddr.Pattern = "收货地址[::]\s*([^\s,,;;]+)" Set matches = regAddr.Execute(inputText) If matches.Count > 0 Then Range("D2").Value = matches(0).SubMatches(0) End Sub

对于地址的提取,用[^\s,,;;]+表示匹配任意不是空白、中文逗号、英文逗号、分号的连续字符,这样能避免把后面的备注信息也吞进来。这个"排除字符类"的写法在提取不定长字段时非常实用。

5.3 数据校验:用正则实现远超数据验证的复杂规则

Excel自带的"数据验证"只能做简单限制,但遇到"必须包含大小写字母和数字、长度8到20位"这种规则就无能为力了。写一个UDF就能实现:

Function CheckPasswordStrength(pwd As String) As Boolean Dim reg As Object Set reg = CreateObject("VBScript.RegExp") reg.Pattern = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,20}$" CheckPasswordStrength = reg.Test(pwd) End Function

注意这个模式用了三个正向先行断言(?=.*[a-z]),表示"字符串中必须存在小写字母",同时用(?=.*[A-Z])和(?=.*\d)分别要求大写字母和数字。因为断言不消耗字符,所以最后的.{8,20}匹配的是整个字符串。这种写法之所以在VBA里可用,是因为VBScript引擎支持正向先行断言,只是不支持后行断言。

6. 常见问题与排查技巧实录

6.1 为什么我的正则匹配不到中文

这是许多新手第一个卡住的地方。VBA的字符串本身是Unicode,正则引擎处理中文没什么障碍。匹配不到中文时,先检查是不是存在不可见字符,比如全角空格、零宽空格、不换行空格。我的排查习惯是:先用Len和Asc逐个字符看,或者用Code函数看字符编码。很多从网页复制来的文本里隐藏着Chr(160)(不换行空格),视觉上看是空格,但正则的\s不一定匹配它,因为VBScript里的\s对Unicode空格的支持不完整。更稳妥的办法是先用Replace把Chr(160)替换成普通空格,或者直接用[ \t\r\n]这类显式字符类代替\s。

6.2 Global=False导致的"只匹配第一个"陷阱

前面提过,RegExp对象的Global属性默认是False,意味着Execute只返回第一处匹配。这导致很多人写的提取代码,在多个目标字段需要同时提取时,只拿到第一个就停了。排查方法很简单,在设置Pattern之后强行加一行reg.Global = True,一切就正常了。我建议把"创建正则对象"和"设置全局属性"写成一个固定的辅助函数,避免每次遗忘。

6.3 大括号转义与特殊字符处理

正则里*、+、?、(、)、[、]、{、}、\、|、^、$、.这些字符都有特殊含义。如果你要匹配字面意义上的星号,不能直接写*,要写成\*。比如匹配某个型号"ABC*123",Pattern应该写成"ABC\*123"。我见过不少人在这里折腾半天,因为没转义,模式变成"AB"后跟任意多个C,当然匹配不上。

6.4 WPS环境下的兼容性坑

如果你的文件在WPS里跑,WPS对VBA的支持大体兼容,但正则库依然是VBScript.RegExp,所以代码不用改。唯一容易出问题的是引用声明:在WPS里可能看不到"Microsoft VBScript Regular Expressions 5.5"这个引用项,这时候直接用CreateObject("VBScript.RegExp")就对了。另外,WPS的UDF函数刷新时机和Excel不太一样,如果你改了单元格数据,函数结果却没变,可以按Ctrl+Alt+F9强制重算。This is one difference I've noticed after switching between the two platforms。

6.5 正则效率问题:大数据量的循环内调用

如果你在1万行数据上循环调用正则,速度可能会让你有点着急。优化方向有三个:第一,在每个Sub里只创建一次正则对象,不要在循环里反复CreateObject;第二,能用Test就不执行Execute,能用Execute就不用Replace的额外开销;第三,给每个单元格匹配前加一个最简单的快速排除条件,比如If InStr(1, cell.Value, "关键词") > 0 Then,先筛掉明显不匹配的行,再跑完整正则。我把一个两万行日志的清洗任务从十几分钟压缩到两分钟,主要就是靠第三个技巧。

6.6 正则表达式在线测试与调试

在VBA编辑器里调试正则比较痛苦,看不到中间结果。我的习惯是先在在线正则测试工具(比如regex101之类的工具,注意选择语言对应VBScript/Python选项)里调试好模式,确认无误后再贴回VBA。贴回来时要注意转义:VBA字符串里双引号要用两个双引号表示,正则里的反斜杠不用额外转义。比如正则里写\d,在VBA代码里就写成"\d",不需要变成"\\d",这一点和Python、Java不一样,很多从其他语言转过来的朋友会习惯性地写双反斜杠,结果匹配的就是字面意义的反斜杠加字母d,白白踩坑。

7. 从单条正则到完整小工具的进阶思路

正则本身只是库函数,把它封装成好用的Excel工具才是终极目的。我在实际项目里最常用的是这么几个封装套路,分享出来供参考。

第一,把常用正则存成一个"规则配置表"。在Excel里放一个隐藏工作表叫做"RegexRules",A列是规则名称,B列是正则模式,C列是说明。你的主程序只要用Application.VLookup从配置表取模式,就能随时调整规则而不需要改代码。这种做法的好处是,不懂代码的同事也能通过改单元格里的正则来适配新的数据格式。我做个"手机号清洗工具"时,同事后来自己加了"固话号码"规则,就是靠这个配置表实现的。

第二,把提取结果输出做到"一键式"。一个实用的小工具,通常不会只有处理逻辑,还包括用户选择和进度反馈。比如选中要处理的区域,点击按钮,宏先弹出一个选项框让你选择"提取手机号/提取邮箱/提取日期",然后跑完数据弹一个MsgBox提示完成了多少行。注意,在处理过程中用Application.StatusBar显示进度,配合DoEvents让Excel界面及时刷新,能避免在大数据量时被人误以为程序卡死。

第三,考虑错误处理与空白兼容。对每个单元格执行正则之前,先判断IsEmpty或Trim(cell.Value) = "",避免对空单元格执行无意义的匹配。同时,你的自定义函数如果返回的是字符串,建议统一处理成Null或空字符串二选一,避免在单元格里显示0或者错误值干扰用户判断。正则提取不到内容时返回空字符串,在表格里看起来舒服很多。

8. 学习路径与避坑总结

学到这里你应该感觉到了,正则表达式的学习曲线不是那种陡峭到让人崩溃的,但它的知识密度确实比普通函数要高。我建议的练习顺序是:先用Test做简单的手机号、邮箱校验,建立"模式匹配"的直觉;再用Replace清洗一批脏数据;最后用Execute提取分组字段。每一步都配一个小脚本,放到实际数据里去验证,不要光看不练。

最后再分享一个我反复踩过的坑:正则模式里的括号嵌套,只靠肉眼很容易看错。当你需要提取的信息在很深的嵌套结构里时,建议先从最内层的括号开始写,写完用Test验证最内层是否匹配,再一层一层向外包。我在提取复杂日志格式时,用的就是这种"由内向外构建正则"的方法,它帮我省下了大量调试时间。

这一章的正则内容就这些。下一章我会接着写VBA数组、字典和文件操作,把处理海量数据的最后一块拼图补上。到时候你就能真正体会到"正则负责精准地抓,数组字典负责高效地存",两者配合起来,Excel就不再是表格工具,而是一个能处理结构化数据的轻量级开发平台了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 18:51:51

多相Buck电源设计实战:从架构选型到PCB布局与调试

1. 多相Buck电源到底在解决什么问题第一次接触多相Buck的人&#xff0c;多半是被一个很朴素的问题逼过来的&#xff1a;CPU或GPU的电流需求涨得太快了。早些年一颗桌面处理器满载电流也就几十安培&#xff0c;单相Buck配一颗不错的电感加几个MOSFET就能扛住。但现在一颗高端服务…

作者头像 李华
网站建设 2026/11/5 0:42:41

YOLOv5+DeepLabV3Plus仪表识别C++部署实战

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

作者头像 李华
网站建设 2026/10/22 16:56:54

Vue+Node.js线下演出售票管理系统:选座防超卖与权限控制实战

最近在整理之前做的一个线下演出售票管理系统&#xff0c;正好把整个设计和实现过程重新梳理了一遍。这个系统基于 Vue 和 Node.js 开发&#xff0c;核心就一件事&#xff1a;把线下演出的票务流转管起来。和普通电商系统不一样&#xff0c;它天然带着三个身份——买家、卖家、…

作者头像 李华
网站建设 2026/10/22 20:37:39

ponytail浏览器自动化插件:规则配置、元素定位与常见问题排查

很多做浏览器自动化、网页数据采集的朋友&#xff0c;这两年应该都注意到一个叫 ponytail 的项目。我最早是在逛一个技术社区时瞥见的&#xff0c;当时只当又是一个包装精致的采集工具&#xff0c;没太当回事。后来手里有个需求要反复处理十几个后台页面的表单填写&#xff0c;…

作者头像 李华
网站建设 2026/10/22 16:53:48

SpringBoot+Vue房屋租赁管理系统:从数据库设计到部署实战

房 租 赁 管 理 系 统 这 个 项 目 名 字 &#xff0c; 在 毕 设 题 目 里 属 于 经 典 得 不 能 再 经 典 的 存 在 。 SpringBoot Vue 的 组 合 &#xff0c; 加 上 完 整 的 S Q L 脚 本 和 接 口 文 档 &#xff0c; 基 本 上 覆 盖 了 一 个 J a v a W e b 全 栈 毕 设 需…

作者头像 李华
网站建设 2026/10/22 16:57:18

智能体技能设计实战:固化任务流程,打造可复用技能包

做 Agent 应用的人&#xff0c;大概率都遇到过这个尴尬&#xff1a;同样的调研类任务&#xff0c;前天和昨天让同一个模型执行&#xff0c;给出的报告格式都变样&#xff0c;甚至偶尔会漏掉关键步骤。最开始我以为是模型幻觉问题&#xff0c;后来才发现&#xff0c;问题出在“没…

作者头像 李华