传输规则中使用的正则表达式
适用于:Exchange Server 2013、Exchange Server 2016、Exchange Server 2019、Exchange Online
可以使用 Microsoft Exchange Server 2016 和 2019 传输规则谓词中的正则表达式来匹配邮件 (不同部分的文本模式,例如邮件头、发件人、收件人、邮件主题和正文) 。 根据条件和例外来使用谓词,确定是否应将所配置的操作应用于电子邮件。
备注
由于客户环境的差异,Microsoft 客户支持服务 (CSS) 无法参与自定义正则表达式脚本的开发或测试, (“正则表达式脚本”) 。 对于 RegEX 自定义脚本开发、测试和调试,Office 365客户将需要依赖内部 IT 资源。 此外,Office 365 客户可以选择使用外部咨询资源,如 Microsoft 咨询服务 (MCS)。 无论脚本开发资源如何,CSS EXO 和 EOP 支持工程师都无法帮助客户进行自定义正则表达式脚本查询。
要查找与传输规则相关的管理任务吗? 请参阅Managing Transport Rules。
本文包含以下各节:
要了解正则表达式,首先必须了解简单表达式。 “简单表达式”是要完全在邮件中匹配的特定值。 使用简单表达式的谓词匹配特定词语或字符串。 简单表达式的一个示例是组织不希望在组织外部分发的文档的标题,例如 年度销售Forecast.doc。电子邮件中的一段数据必须与简单表达式完全匹配,才能满足传输规则中的条件或例外。
“正则表达式”是一种简洁而灵活的表示法,可用于查找邮件中的文本模式。 该表示法由以下两种基本字符类型组成:
- 文本字符:必须存在于目标字符串中的文本。 这些字符是普通字符,如类型所示。
- 元字符:一个或多个未按字面解释的特殊字符。 这些字符指示文本在目标字符串中如何变化。
可以使用正则表达式快速分析电子邮件以查找特定的文本模式。 通过这些表达式,可以检测具有特定类型内容的消息,例如社会安全号码 (SSN) 、专利号码和电话号码。
由于简单表达式要求您输入要检测值的每种可能的变体,因此无法使用简单表达式来正确匹配此数据。 在许多情况下,对此类应用程序使用简单表达式是一项后勤挑战,在消息内容中匹配大量简单表达式可能会占用大量资源。 使用正则表达式的效率更高。 为了搜索文本模式,您可以配置传输规则谓词,而不是指定所有可能的变体。
在 Exchange 命令行管理程序中,可以在接受 Patterns 谓词属性的任何谓词中使用正则表达式。 在Exchange 管理控制台中,可以将正则表达式用于包含具有文本模式的字词的任何条件或异常。 有关谓词的详细信息,请参阅Transport Rule Predicates。
警告
必须仔细测试构造的正则表达式,以确保它们产生预期的结果。 配置错误的正则表达式会产生意外的匹配,并导致不必要的传输规则行为。 这些影响可能会导致对消息和消息内容执行不需要的操作,在使用诸如拒绝或弹跳消息等操作时可能导致数据丢失。 此外,复杂的正则表达式可能会影响电子邮件传输性能。 应先在测试环境中对正则表达式进行测试,然后才能将其用于生产环境。
下表列出了可用于在 Exchange Server 2016 和 2019 中创建模式匹配正则表达式的模式字符串:
模式字符串 | 说明 |
---|---|
\S | \S 模式字符串将与任何非空格的单个字符匹配。 |
\s | \s 模式字符串将与任何单个空白字符匹配。 |
\D | \D 模式字符串将与任何非数值数字匹配。 |
\d | \d 模式字符串将与任何单个数值数字匹配。 |
\w | \w 模式字符串与分类为字母或十进制数字的任何单个 Unicode 字符匹配。 |
\W | \W 模式字符串将与未归类为字母或十进制数字的任何单个 Unicode 字符匹配。 |
* | 星号 (*) 字符将与零个或多个上述字符匹配。 例如,ab*c 匹配以下字符串:ac、abc 和 abbbbc。 |
( ) | 圆括号充当分组分隔符。 例如,a(bc)* 将与下列字符串匹配:a、abc、abcbc、abcbcbc 等。 |
\ | 反斜线是用作特殊字符前的转义字符。 特殊字符是模式字符串中使用的字符:反斜杠 ( \ ) ;管;星号 ( * ) ;左括号 ( ( ) ;右括号 ( ) ) ;插入符号 ( ^ ) ;美元符号 ( $ ) 。 例如,如果要匹配包含 (525) 的字符串,可以键入 (525) 。 |
^ | 插入符号 (^) 字符表示该插入符号后面的模式字符串必须存在于所匹配的文本字符串的开头。 例如, ^fred@contoso 匹配 fred@contoso.com ,fred@contoso.co.uk但与 匹配,但与 匹配。alfred@contoso.com |
$ | 美元符号 $ 字符指示前面的模式字符串必须存在于要匹配的文本字符串的末尾。 例如,contoso.com$ 与 和 kim@research.contoso.com匹配adam@contoso.com,但不匹配 kim@contoso.com.au。 |
通过使用上表,可以构造出与要匹配的数据模式相匹配的正则表达式。 请从左到右在要匹配的数据中检查每个字符或字符组。 阅读每个模式字符串的说明,确定如何将其应用于要匹配的数据。 随后确定该表中的哪个模式字符串表示该字符或字符组,并将该模式字符串添加到正则表达式中。 完成后,您可以得到一个完整构造的正则表达式。
此正则表达式的示例与格式为 425 555-0100 和 425.555.0100 的北美电话号码匹配。
425(\s|.)\d\d\d(-|.)\d\d\d\d
通过添加在区域代码前后使用圆括号的电话格式 (425) 555-0100,可以扩展此示例。 此正则表达式的示例与所有的三个电话号码格式匹配。
\d\d\d ( (\s|.|-|) |) \s) \d\d\d (\s|.|-) \d\d\d\d
可以按如下所示分析上面的示例:
- \d\d\d:此部分要求首先显示正好三个数字数字。
- ( (\s|.|-|) |) ) :此部分要求三位数后存在空格、句点或连字符。 每个字符匹配的字符串都包含在分组分隔符中,并被管道字符分隔。 这种分隔意味着分组分隔符内的指定字符中只有一个可以存在于要匹配的字符串中的此位置。 对于区号与接下来的三位数字之间的分隔,它还会查找闭括号或闭括号和空格。
- \d\d\d:此部分要求下一个数字正好显示三个数字。
- (\s|.|-) :此部分要求三位数后存在空格、句点或连字符。
- \d\d\d\d:此部分要求紧接四位数字。
上述正则表达式将与以下示例值匹配:
- (425) 555.0100
- 425 555 0100
- 425 555 0100
- (425) 555-0100
- 425-555-0100
- (425) 555-0100
本示例在 PowerShell 中创建一个传输规则,该规则使用正则表达式来匹配电子邮件主题中的 SSN。
New-TransportRule -Name "Social Security Number Block Rule" -SubjectOrBodyMatchesPatterns '\d\d\d-\d\d-\d\d\d\d' -RejectMessageEnhancedStatusCode "5.7.1" -RejectMessageReasonText "This message has been rejected because of content restrictions"
本示例允许您查看新的传输规则。
Get-TransportRule "Social Security Number Block Rule" | Format-List