在微软的OCS和LYNC中,有一个相对有点难度的知识点就是正则表达式(Regular Expression)了。如果要弄企业语音就一定会面对这个正则表达式这个问题了。今天我们就来聊聊OCS和LYNC内的正则表达式。

什么是正则表达式?我们为什么要弄正则表达式?首先我们要回答这个问题。正则表达式就是计算机用来处理字符串的,把我们所输入的一般性的东西经过正则表达式处理之后变成计算机用的规范性的东西。在OCS里面,我们会在三个地方碰到正则表达式:

第一个:由于OCS需要E.164格式的号码。所以在处理用户在OC或者LYNC客户端输入的电话号码时,用户所输入的非规范性的号码需要经过正则表达式处理之后变成规范的字符串。比如说用户拨打一个北京的座机号码,他输入了01012345678,OCS需要把号码转变成+861012345678。这个转变过程就是由正则表达式所完成的。

第二个地方:在OCS把号码送到中介服务器的时候。在这里需要由正则表达式来完成匹配工作。比如如果一个北京的用户被授权只能拨打本地的电话的话,那么+862112345678(上海号码)就不能被送到中介服务器上去。这个时候也是由正则表达式来完成匹配的。

第三个地方:用户在AD里面可能会有一些和电话有关的属性字段,在OCS生成地址簿文件的过程中,用户的号码也要被规范化,这个过程中,又是正则表达式在起作用。

 所以说我们可以这里来理解正则表达式,它就是一个小盒子,非规范的字符串在经过这个盒子之后就成规范的了。这个处理过程我们就成为匹配。

正则表达式是什么样子的呢?我们来看看它的庐山真面目:

\+?[\s()\-\./]*1?[\s()\-\./]*\(?\s*([2-9]\d\d)\s*\)?[\s()\-\./]*(\d\d\d)[\s()\-\./]*(\d\d\d\d)[\s]*

看得头晕了吧,上面的字符串就是一个正则表达式。很是复杂。相信看完本文,你就可以看懂了这些奇怪的符号的意思了。为什么要弄这么复杂,因为用户的输入是千奇百怪的,为了处理这些千奇百怪,我们的正则表达式就要考虑到所有的情况,所以就变得复杂了。但是它也是有规律的,只要学了基本概念,你也可以轻松地看懂上面的内容。

网上有很多的正则表达式的教程,我今天就比较有针对性只是讲和OCS或者LYNC有关的地方了。如果大家还想进一步研究,可以去google一下了。

在OCS里面的正则表达式打交道,我们需要提前记住一些正则表达式的一些基本内容。

这里我们就先记几个在OCS里面非常常见的符号。

符号

表示意思

\

如果出现这个,就意味着它后面的字符是一个字符。计算机就不处理这个字符原本所的意思了。

实例:因为+也是一个正则表达式内的特殊符号,所以如果我们只是要这个+号的本意,我们就要在前面加\来告诉计算机不要特殊对待这个+号。

?

说面?号前面的表达式可能出现也可能不出现。

实例:+? 表示这个+可能出现,也可能不出现

*

前面的表达式出现多次或者一次也没有出现

实例:12*表示1(未出现)或者122(出现一次)

\s

代表空格

\d

匹配一个数字

^

匹配输入字符串的开始

$

匹配输入字符串的结尾

|

并列

[xyz]

xyz3个字符的合集,匹配里面的任意一个字符,匹配之后不存储

()

匹配括弧里的字符串,但是要储存

{}

大括弧里面为要匹配的次数,

实例:{2}表示前面的字符要匹配2次

[^xyz]

不包含xyz的字符合集

在OCS内,我们匹配了字符串以后,还要生成新的字符串,所以就要用到刚才匹配到的那些字符串。这里有一个转换规则的概念。转换规则就很简单了,里面就只有一个符号$,符号前面会有一个数字,比如说1$就开始刚才捕获到的一个()里面的内容,而2$就表示第二个()里面的内容。

如果看得还是很模糊,那就用实例来说明一下:

先来一个简单的。

匹配条件

转换规则

^(\d{4})$

+$1

匹配条件说明

^表示这个就是要匹配的字符串的开始,它和后面的$是对应的。

()的意思就是,要匹配括弧中的字段,并把匹配之后的内容存起来。

\d表示要输入数字型的字符

{4}表示要匹配4次,那就是就要求4个字符。所以\d{7}就表示要一个4位的数字。

转换规则说明

+就是加一个+在结果里

$1就是把刚才()里面存的东西放在这里

如果用户输入1234,那么经过它们处理之后的就是+1234,如果用户输入123,它不会变成+123,因为123不能被匹配。

 

匹配条件

转换规则

^(\d{8})$

+8628$1

这个和上面的类似,结果就是用户输入一个任意8位数,结果就会在前面加上+8628

原始字符:12345678,结果:+8612812345678

匹配条件

转换规则

^(1\d{10})$

+86$1

匹配条件里面有了一个1,以为着用户输入的第一个字符必须是1,不然就不会匹配下去了。

原始字符:13512345678,结果:+8613512345678

匹配条件

转换规则

^00(\d{*})$

+$1

这里的00跑到()外面了,也就是说00是必须要有的,但是不会被储存起来。

原始字符:0012345678 结果:+12345678

匹配条件

转换规则

^86([2-8] \d)(\d{8})$

+9$2

匹配后面括弧里面的内容,第三位数字必须是2-8之间的数字,如果是其它则不匹配

原始字符:862812345678结果:+912345678

 

在刚才提到的OCS的第二处也就是路由选择的时候所用到正则表达式就没有转换规则了。

比如说^\+86(\d*)$表示符合+86开头的字符串就可以到达中介服务器。

^\+86((28)(\d*)|1(\d{10}))$就有点复杂啦,里面有个|表示或者,所以这个正则表达是的意思就是+8628开头的字符串,或者 以+861开头的10位数都可以到达中介服务器。

 

^\+(\d*)$就很简单了,只要是+开头的任意数字都可以到达中介服务器。

 上面提到的OCS第三点的正则表达式在OCS服务器的Company_Phone_Number_Normalization_Rules.txt文件内,大家可以去找了打开看看,相信你现在应该可以看得懂里面的内容了,并且可以编写自己的正则表达式了。


到这里就结束了大家可以参照上面的内容来解释一下下面的字符串。

^([01]\d)/([0-3]\d)/(\d{4})$

^(\(\d{3}\)\s|\d{3}\s)(\d{3}[\s-]\d{4})(\sx\d+)?$

还有我们最上面的那个:\+?[\s()\-\./]*1?[\s()\-\./]*\(?\s*([2-9]\d\d)\s*\)?[\s()\-\./]*(\d\d\d)[\s()\-\./]*(\d\d\d\d)[\s]*

 最后考考大家,如果我只想让用户拨打的12580号码不能到达中介服务器,而其它号码可以顺利通过,我的正则表达式要怎么写呢?

 如果还有兴趣,建议到微软的网站去学习更多关于正则表达式的内容。

地址:http://msdn.microsoft.com/en-us/library/28hw3sce