第一部分:为财务专业人士揭秘正则表达式
正则表达式(Regex)是一种描述和匹配文本模式的语法,被广泛用于数据查找与替换。对于会计和财务专业人士,正则表达式能极大简化数据清理、验证和提取任务,提升效率和准确性。
1.1 什么是正则表达式?为何CPA需要它?
从根本上说,正则表达式(常简称为Regex或Regexp)是一种用于描述和匹配文本模式的“语言”或逻辑公式。它本身不是一个函数,而是一种强大的语法,被各种函数用来执行高级的“查找与替换”操作。
对于会计和财务专业人士而言,日常工作中充斥着大量繁琐的数据处理任务。例如,清理格式不一的客户数据、验证发票号码或身份证号的准确性、从银行对账单描述或PDF导出的非结构化文本中提取关键数字等。使用传统的Excel或WPS函数(如LEFT、RIGHT、MID、FIND和SUBSTITUTE)来处理这些任务,往往需要构建复杂且冗长的嵌套公式,不仅难以维护,而且一旦数据格式稍有变化就容易出错。
正则表达式正是解决这些痛点的终极工具。它提供了无与伦比的精确性和效率,能够用一个简洁的模式取代数十个嵌套函数,使您的公式更清晰、更稳健。
诚然,正则表达式的语法初看起来可能令人望而生畏。但本指南将采用循序渐进的方式,向您证明,只需掌握少数几个核心模式,便能解决90%以上的常见数据处理难题,从而极大地提升工作效率。
1.2 核心构成:Regex语法速查
本节将分解正则表达式的基本构建模块。我们的目标是理解,而非死记硬背。一个核心的参考速查表将贯穿始终,为您提供支持。
字面字符 (Literal Characters)最简单的概念:模式 a 匹配字符"a",模式 Invoice 匹配字符串"Invoice" 2。元字符 (Metacharacters) - “魔法”字符元字符是正则表达式的精髓,它们拥有特殊的含义,而非代表其本身 9。\d:匹配任意数字,等同于 [0-9]。\D 则匹配任意非数字,等同于 [^0-9]6。\w:匹配任意“单词”字符(字母、数字、下划线),等同于 [a-zA-Z0-9_]。\W 则匹配任意非单词字符 2。\s:匹配任意空白字符(空格、制表符、换行符等)。\S 则匹配任意非空白字符 6。指定字符:[abc] 匹配 “a”、“b”、“c” 中的任意一个 13。范围:[a-z] 匹配任意小写字母,[0-9] 匹配任意数字 2。排除:[^0-9] 匹配任意非数字字符 2。通配符 (.):匹配除换行符外的任何单个字符。例如,h.t 可以匹配 “hat”、“hot” 或 “h&t” 2。字符类 (``):匹配方括号中任意一个字符。预定义字符类 (快捷方式):为方便使用,Regex提供了一些常用的快捷方式。量词 (Quantifiers) - 匹配多少次?量词用于指定其前面的字符或分组出现的次数 2。* (星号):匹配零次或多次。例如,cat 可以匹配 “ct”、“cat”、“caaat” 2。+ (加号):匹配一次或多次。例如,ca+t 可以匹配 “cat”、“caaat”,但不能匹配 “ct” 2。? (问号):匹配零次或一次(即可选)。例如,colou?r 可以匹配 “color” 和 “colour” 2。{n} (花括号):精确匹配n次。例如,\d{4} 匹配恰好4个数字 2。{n,m} 和 {n,}:匹配次数范围。\d{2,4} 匹配2、3或4个数字;\d{2,} 匹配至少2个数字 2。锚点 (Anchors) - 在字符串的哪个位置?锚点用于指定匹配发生的位置,但它们本身不匹配任何字符 6。^ (脱字符):匹配字符串的开头。^Invoice 仅当字符串以"Invoice"开头时才匹配 13。$ (美元符):匹配字符串的结尾。\d$ 仅当字符串以数字结尾时才匹配 13。\b (单词边界):匹配单词的“边缘”(例如,字母和空格之间)。\bTotal\b 会匹配独立的单词 “Total”,但不会匹配 “Subtotal” 中的 “Total” 15。分组与捕获 (())圆括号有两个核心功能:一是将多个元素组合成一个单元,二是可以“捕获”匹配到的文本以供后续使用 2。这是REGEXEXTRACT 和 REGEXREPLACE 函数实现高级功能的关键。例如,(Invoice|Receipt)-\d+ 将 “Invoice” 和 “Receipt” 归为一组。转义字符 ()如果要匹配元字符本身(如 .、、?),需要在其前面加上反斜杠 \。例如,要查找字面上的 .,必须使用 . 2。替换/或 (|)| 符号充当“或”操作符。例如,(USD|EUR|CNY) 可以匹配 “USD”、“EUR” 或 “CNY” 2。
为了便于查阅,下表汇总了上述所有核心元字符。
表1:正则表达式元字符速查表
| 符号 | 描述 | 示例模式 | 匹配内容示例 |
|---|---|---|---|
. | 通配符 | a.c | abc, a1c |
[abc] | 字符集 | gr[ae]y | gray, grey |
[a-z] | 范围 | [0-9] | 任意数字 |
[^abc] | 排除型字符集 | [^0-9] | 非数字字符 |
\d | 数字 | \d{3} | 123 |
\D | 非数字 | \D+ | ABC- |
\w | 单词字符 | \w+ | Invoice_01 |
\W | 非单词字符 | \W | @, #, 空格 |
\s | 空白字符 | Amount\s\d | Amount 5 |
\S | 非空白字符 | \S+ | word |
* | 零次或多次 | ab*c | ac, abc, abbc |
+ | 一次或多次 | ab+c | abc, abbc |
? | 零次或一次 | colou?r | color, colour |
{n} | 恰好n次 | \d{4} | 2023 |
{n,} | 至少n次 | \d{2,} | 12, 123 |
{n,m} | n到m次 | \d{2,4} | 12, 123, 1234 |
^ | 开头锚点 | ^Start | 以 Start 开头 |
$ | 结尾锚点 | End$ | 以 End 结尾 |
\b | 单词边界 | \bword\b | 独立单词 word |
(...) | 分组/捕获 | (ab)+ | ab, abab |
| ` | ` | 或 | `cat |
\ | 转义符 | \. | 字面上的 . |
第二部分:WPS表格中的正则表达式
本部分将为WPS环境提供一个实用的、逐函数的功能指南。它将充分利用您对电子表格函数的熟悉度。
本部分将为WPS环境提供一个实用的、逐函数的功能指南。它将充分利用您对电子表格函数的熟悉度。
本部分将为WPS环境提供一个实用的、逐函数的功能指南。它将充分利用您对电子表格函数的熟悉度。
2.2 REGEXEXTRACT
- 用途:提取第一个匹配项或捕获组
- 语法:
=REGEXEXTRACT(text, pattern) - 示例:
=VALUE(REGEXEXTRACT(A2, "¥([\d,]+\.\d{2})"))提取金额
2.3 REGEXREPLACE
- 用途:替换所有匹配项
- 语法:
=REGEXREPLACE(text, pattern, replacement) - 示例:
=REGEXREPLACE(A2, "(\w+), (\w+)", "$2 $1")重排姓名格式
注意:REGEXEXTRACT只提取第一个匹配项,REGEXREPLACE会替换所有匹配项。
第三部分:Excel中的正则表达式
Excel使用正则表达式的方式取决于版本:
3.1 现代Excel (Microsoft 365)
- 原生支持正则表达式,采用PCRE2引擎
- 主要函数:
REGEXTEST(text, pattern, [case_sensitivity])REGEXEXTRACT(text, pattern, [return_mode], [case_sensitivity])REGEXREPLACE(text, pattern, replacement, [occurrence], [case_sensitivity])
- 支持提取所有匹配项和替换指定匹配项
3.2 经典Excel (2019/2016等)
- 无原生支持,需通过VBA自定义函数实现
表2:跨平台Regex函数对比
| 功能 | WPS表格 | 现代Excel(M365) | 经典Excel(VBA) |
|---|---|---|---|
| 匹配 | REGEXMATCH | REGEXTEST | RegexMatch |
| 提取 | REGEXEXTRACT | REGEXEXTRACT | RegexExtract |
| 替换 | REGEXREPLACE | REGEXREPLACE | RegexReplace |
| 提取所有匹配项 | 不支持 | [return_mode]=1 | 需自定义VBA |
| 替换指定项 | 不支持 | [occurrence]=n | [instance]=n |
| 大小写控制 | 不支持 | [case_sensitivity] | [match_case] |
第四部分:CPA实战Regex手册
常见会计任务的正则表达式解决方案:
| 任务描述 | 示例数据 | 正则表达式模式 | 示例公式 (WPS/Excel M365) |
|---|---|---|---|
| 验证身份证号 | 44010620000101123X | `^\d{17}(\d | X)$` |
| 验证信用代码 | 91440101MA59A12345 | ^[A-Z0-9]{18}$ | =REGEXMATCH(A2, "^[A-Z0-9]{18}$") |
| 验证邮箱 | [email protected] | ^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$ | =REGEXMATCH(A2, "^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$") |
| 验证手机号 | 13812345678 | ^1[3-9]\d{9}$ | =REGEXMATCH(A2, "^1[3-9]\d{9}$") |
| 提取整数 | 订单号: ORD-98765 | \d+ | =REGEXEXTRACT(A2, "\d+") |
| 提取金额 | 交易金额:¥1,234.56 | [\d,]+\.\d{2} | =VALUE(REGEXEXTRACT(A2, "[\d,]+\.\d{2}")) |
| 提取括号内容 | 部门 (财务部) | \((.*?)\) | =REGEXEXTRACT(A2, "\((.*?)\)") |
| 提取日期 | 发生日期 2023-12-31 | \d{4}-\d{2}-\d{2} | =REGEXEXTRACT(A2, "\d{4}-\d{2}-\d{2}") |
| 移除非数字字符 | 货号 #ABC-123-DEF | [^\d] | =REGEXREPLACE(A2, "[^\d]", "") |
| 移除首尾空白 | 重要数据 | `^\s+ | \s+$` |
| 标准化电话 | 020-88889999 | (\d{3,4})-(\d{7,8}) | =REGEXREPLACE(A2, "(\d{3,4})-(\d{7,8})", "($1) $2") |
| 转换日期格式 | 12/31/2023 | (\d{2})/(\d{2})/(\d{4}) | =REGEXREPLACE(A2, "(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2") |
第五部分:最佳实践与进阶学习
- 分步编写与测试:推荐使用 regex101.com 或 regexr.com 在线测试工具。
- 常见陷阱:
- 贪婪匹配:
.*默认尽可能多地匹配,加?变为懒惰模式,如<.*?> - 反斜杠转义:如
\.匹配字面点 - 善用锚点:
^和$限定位置,提升准确性
- 贪婪匹配:
结论
正则表达式能显著提升会计数据处理效率和质量。掌握核心语法和函数,结合在线工具实践,能让CPA高效完成数据清理、验证和提取任务。
- 本文链接: https://richfan.eu.org/posts/%E7%A8%8B%E6%8A%80/regex/%E6%B3%A8%E5%86%8C%E4%BC%9A%E8%AE%A1%E5%B8%88%E7%9A%84wps%E4%B8%8Eexcel%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E7%BB%88%E6%9E%81%E6%8C%87%E5%8D%97%E7%B2%BE%E9%80%9A%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E7%9A%84%E5%88%A9%E5%99%A8/
- 版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。
