Pattern & Matcher — Complete Example

DEX455 - JSON、XML、ZIP、加密与正则表达式完全指南

📄 第 426 页 🎬 视频课程

课程章节介绍

今天我们来聊聊 Apex 里处理电子邮件的一个实用例子——怎么用正则表达式把乱七八糟的邮箱地址整理成统一的格式,并且还能找出重复的记录。这个例子虽然不长,但里头的门道不少,我们一步步拆开来讲。 首先,想象一下,有些客户填写的公司邮箱可能带着各种奇怪的子域名,比如 john@*.smithco.com,这种格式其实不太标准。我们想要把这种地址简化成 john@smithco.com。怎么做到呢?就用到了带有,命名捕获组,的正则表达式。 这个正则大致会分成两部分:一个是用户名,一个是域名。我们用命名捕获组把这两块分别抓出来,比如给用户名起名叫 `user`,域名叫 `domain`。然后,在匹配的过程中,我们还能对捕获到的域名部分做进一步的清洗,去掉那些多余的星号、点号之类的,只保留 `smithco.com`。 具体代码里,我们会调用 `matcher.replaceAll('')` 这样一个方法。它的作用是把每个匹配到的邮箱地址替换成我们规范化后的格式。这里头其实隐含了一个逻辑:如果你在替换的字符串里引用命名捕获组,就可以重新组合出干净的邮箱。 好,规范化这一步做完了,接下来要在批处理里检测重复的邮箱。这里的“批内”是指我们可能一次性处理一批数据,比如几百条联系人记录。为了防止同一批数据里有重复的规范化邮箱地址,我们可以建一个 Map,Key 就是规范化后的邮箱,Value 是记录本身。这样,当发现 Key 已经存在的时候,就知道遇到了重复,可以进行相应的处理,比如标记或者跳过。 相比批内去重,更关键的是要和数据库里已有的数据比对。Apex 里通常会有一个自定义字段,比如叫 `duplicate_key__c`,专门存储规范化后的邮箱。这样我们就可以直接用 SOQL 查询:“找出所有 `duplicate_key__c` 等于这个新邮箱的现有记录”。如果查到了,就说明老记录已经存在,我们就能做出防重逻辑。 以上是实际业务里和 Salesforce 平台结合的做法。现在再来看一个更基础的正则匹配小例子,帮助大家理解 `Matcher` 的一些方法。 假设我们用一个简单的正则,去匹配一个字符串,并且带了一个捕获组。例如,匹配字母 “a”,并且把它捕获。当你调用 `matcher.find()` 之后,可以用 `matcher.group(0)` 得到整个匹配到的字符串,用 `matcher.group(1)` 得到第一个捕获组的内容。这里注意,`group(0)` 总是代表整个匹配,不管你有没有显式的括号。 还有一个 `end()` 方法,它返回的是最后一个匹配字符后面的那个位置的索引偏移量。这个索引是从 0 开始数的,所以如果整个匹配占了字符串的前几个字符,`end()` 得到的数字其实就是匹配部分的长度,因为它是最后一个字符后面的位置。比如匹配到的部分是从索引 0 到 2,那 `end()` 就是 3。 理解这些小细节,对于后面编写更复杂的正则替换逻辑非常有帮助。 总结一下这一页 Slide 的核心:我们学会了用正则表达式抓取邮箱的用户和域,清洗域名,再用 `replaceAll` 格式化。同时,在批处理内部用 Map 去重,并且利用数据库字段做跨记录比对,防止数据重复。最后还温习了 Matcher 里的 `group` 和 `end` 方法,为实战打下基础。 这样讲,是不是清晰多了?有疑问随时提。

关键词

Apex Salesforce Developer Guide