System Center Operations Manager 中的正则表达式支持

创作管理包时,可能需要在发现和组中包括正则表达式匹配。 在监视器和规则中的表达式条件中,可能还需要正则表达式匹配。

原始产品版本: System Center Operations Manager
原始 KB 数: 2702651

Operations Manager 支持两种不同类型的正则表达式。 必须知道正在使用哪个元素才能选择正确的表达式。 组成员身份计算和表达式筛选器对模式匹配使用不同的语法。

组计算

组计算使用 PERL 正则表达式语法。 默认情况下,匹配不区分大小写,但是可以通过在 XML 中使用特殊属性来指定表达式必须区分大小写。 有关详细信息,请参阅 SimpleCriteriaType

每当使用 Group Calc 模块时,会在管理包(MP)中找到组计算。 表达式 GroupCalc 使用 MatchesRegularExpression 运算符基于模式匹配表达式创建动态组成员身份。 此运算符的实现将 MP XML 中找到的 dbo.fn_MatchesRegularExpression 表达式传递给 SQL 调用名称。 如果此调用返回值 0,则匹配项为 false。 如果返回值 1,则匹配项为 true。

重要

dbo.fn_MatchesRegularExpression SQL 调用名称本身区分大小写,因此动态MatchesRegularExpression组成员身份条件中使用的运算符也将区分大小写。

GroupCalc 还支持两个特殊的子元素,这些子元素使以下常见正则表达式样式查询的抽象表达式。

GroupCalc 特殊函数

GroupCalc 子元素 MP 表达式 正则表达式等效项
ContainsSubstring ^*{O}.*$ (其中替换为 {O} 子字符串)
MatchesWildcard ? .
MatchesWildcard * .*
MatchesWildcard # [0-9]

注意

如果使用这两个特殊运算符之一,则计算始终区分大小写。

表达式筛选器匹配条件

管理包中使用的表达式筛选器使用 .NET Framework 正则表达式语法。 并非所有表达式都起作用。 但是,支持以下 .NET Framework 正则表达式语法元素。 使用表达式 Eval 模块时,管理包中存在表达式筛选器。

Operations Manager 正则表达式语法

构造 Operations Manager 正则表达式
任何单个字符
范围中的字符 [ ]
不在区域中的字符 [^ ]
行首 ^
行尾 $
|
( )
0 或 1 匹配
0 个或多个匹配项 *
1 个或多个匹配项 +
完全 N 匹配 {n}
至少 N 个匹配项 {n,}
最多 N 个匹配项 { , n}
N 到 M 匹配项 {n, m}
换行符 \n
制表符 \t

Operations Manager 正则表达式(正则表达式)示例

示例 1

搜索包含单个字符串的任何匹配项, string1

^(string1)$

示例 2

搜索包含两个字符串之一的任何匹配项, string1string2

^(string1)|^(string2)$

示例 3

在两个文件夹路径下以递归方式搜索与文件夹的任何匹配项(/var/lib/string1/*/var/lib/string2/*):

^(\/var\/lib\/string1\/.*)|^(\/var\/lib\/string2\/.*)$

示例 4

搜索包含两个字符串 Agent1.contoso.com 之一或 Agent2.contoso.com (不区分大小写)的任何匹配项:

^(?i)(agent1.contoso.com)|(?i)(agent2.contoso.com)$

搜索包含 Agent 的任何匹配项(不区分大小写):

^(?i)(agent.*)$

通过 SDK 的正则表达式

Operations Manager SDK 具有用于 筛选对象的“匹配 条件”运算符。 此运算符使用与前面提到的 GroupCalc 事例相同的功能 MatchesCriteria

使用 SDK 构造条件表达式以查找 Operations Manager 数据库中的对象时,以下语法元素有效且有用:

  • 比较运算符
  • 通配符
  • DateTime 值
  • 整数到 XML 枚举比较

比较运算符

构造条件表达式时,可以使用比较运算符。 下表描述了有效的运算符。

SDK 比较运算符

运算符 说明 示例
=, == 如果左右操作数相等,则计算结果为 true Name = 'mymachine.contoso.com'
!=, <> 如果左右操作数不相等,则计算结果为 true Name != 'mymachine.contoso.com'
> 如果左操作数大于右操作数,则计算结果为 true Severity > 0
< 如果左操作数小于右操作数,则计算结果为 true Severity < 2
>= 如果左操作数大于或等于右操作数,则计算结果 为 true Severity >= 1
<= 如果左操作数小于或等于右操作数,则计算结果 为 true Severity <= 3
LIKE 如果左侧操作数与右操作数定义的模式匹配,则计算结果 为 true 。 使用通配符表中的字符定义模式。 Name 'LIKE SQL%'
如果值为 SQLEngine,则Name计算结果true

Name LIKE '%SQL%'
如果值为 MySQLEngine,则Name计算结果true
匹配 如果左侧操作数与右操作数定义的正则表达式匹配,则计算结果为 true Name MATCHES 'SQL*05'
如果值SQL2005,则Name计算结果为 true
为 NULL 如果左侧操作数的值为 null,则计算结果 为 true ConnectorId IS NULL
如果属性不包含值,则ConnectorId计算结果为 true
不为 NULL 如果左侧操作数的值不为 null,则计算结果 为 true ConnectorId IS NOT NULL
如果属性包含值,ConnectorId则计算结果为 true
IN 如果左侧操作数的值位于右操作数定义的值列表中,则计算结果为 true

请注意IN 运算符仅适用于 Guid 类型的属性。
Id IN ('080F192C-52D2-423D-8953-B3EC8C3CD001', '080F192C-53B2-403D-8753-B3EC8C3CD002')
如果属性的值Id是表达式中提供的两个全局唯一标识符之一,则计算结果为 true
AND 如果左右操作数均为 true,则计算结果 为 true Name = 'SQL%' AND Description LIKE 'MyData%'
OR 如果左侧操作数或右操作数为 true,则计算结果为 true。 Name = 'SQL%' OR Description LIKE 'MyData%'
NOT 如果右操作数不为 true,则计算结果为 true NOT (Name = 'IIS' OR Name = 'SQL')

通配符

下表定义了在使用运算符时可用于构造模式的 LIKE 通配符。

用于 LIKE 运算符的通配符运算符

通配符 说明 示例
% 与任意数量的字符匹配的通配符。 Name LIKE 'SQL%'
如果值为 SQLEngine,则Name计算结果true

Name LIKE '%SQL%'
如果值为 MySQLEngine,则Name计算结果true
_ 与单个字符匹配的通配符。 Name LIKE 'SQL200_'
对于以下Name值,计算结果为 true

SQL2000
SQL2005

注意:表达式的计算结果为 false因为符号 _ 必须与值中的Name一个字符完全匹配。
[] 与包含在字符集中的任何一个字符匹配的通配符。

注释括号在限定对 MonitoringObject 属性的引用时也使用。 有关详细信息,请参阅 定义监视对象的查询。
Name LIKE 'SQL200[05]'
对于以下Name值,计算结果为 true

SQL2000
SQL2005

表达式的计算结果为 false,SQL2003
[^] 与字符集中未包含的任何字符匹配的通配符。 Name LIKE 'SQL200[^05]'
SQL2003的计算结果为 true

表达式的计算结果为 false,SQL2000SQL2005。

DateTime 比较

在查询表达式中使用 DateTime 值时,请使用常规 DateTime 格式 (G) 将 DateTime 值转换为字符串值。 例如:

string qStr = "TimeCreated <= '" + myInstant.ToString("G") + "'";
ManagementPackCriteria mpCriteria = new ManagementPackCriteria(qStr);

将所有日期值转换为 G 格式(GMT), 以便进行有效的字符串比较。

与枚举的整数值比较

在查询表达式中使用整数枚举值时,将枚举值强制转换为整数。

例如:

string qStr = "Severity > " + (int)ManagementPackAlertSeverity.Warning;
MonitoringAlertCriteria alertCriteria = new MonitoringAlertCriteria(qStr);

详细信息