概述
https://freeswitch.org/confluence/display/FREESWITCH/Regular+Expression
1 摘要
本文列举一些便利的正则表达式。在FreeSwitch的世界里,正则表达式的身影随处可见。这份文档里有很多实例,说明XML拨号方案的条件表达式里是怎样使用正则表达式的,有兴趣的话可参考。
2 值的获取
圆括号里的模式匹配时,其值会按顺序转储到变量里,变量名$1, $2......而变量$0包含完整的pattern值。
3 实例
3.1 免费号码
下面表达式匹配所有免费号码:
^(+?1)?(8(00|44|55|66|77|88)[2-9]d{6})$
这时,8005551212 、 18005551212 或 +18005551212 都能匹配成功,而$2的填充值都是"8005551212"。
下面挨个字符给出详细解释:
- ^ - 指示正则表达式的开始(这是必要的字符);
- ( - 指示正则表达式块的开始。块对于表达式内部定义来说至关重要,块的内容可以由变量$1, $2, $3......引用;
- +1|1? - 指标可选前缀 '+1' 或'1' (问号? 的语义表示所定义的内容是可选的);
- ) - 块的闭合处;
- 8 - 匹配字面值 '8';
- ( - 另一个块的起始标识;
- 00|55|66|77|88 - 匹配00 或 55 或 66 或77 或 88 (或许你已经猜中了,管道符 | 表示逻辑或操作);
- ) - 内部块的闭合处;
- [2-9] - 匹配2到9(2, 3, 4, 5, 6, 7, 8 和9)范围内的一位数字,一对中括号表示取值范围,[0-9]表示0到9;而 [a-z]表示字符a到z;
- d - 匹配任意有效的数字,等价于[0-9];
- {6} - 定义前一个表达式重复出现的次数。即由0到9的任意数字组成的6位数。重复数字可以指定一个范围,比如说:6到9位数 {6,9};或者,最少6位数,不限定最多位:{6,};
- ) - 块定义的闭合处;
- $ - 指示正则表达式的结束(必要字符)。
3.2 严格匹配七位数字
下面表达式匹配七位电话号码
^(d{7})$
比如说,5551212
将匹配成功,这时$1
的值为"5551212";而95551212将匹配失败,因为长度太长;555121A也将匹配失败,因为规则不允许出现字母。
3.3 严格匹配十位电话号码
下面表达式匹配十位电话号码
^(d{10})$
比如说,8005551212
将匹配成功,这时$1
的值为"8005551212 ";而18005551212 将匹配失败,因为长度太长。
3.4 严格匹配十一位电话号码
^(d{11})$
比如说,18005551212
将匹配成功,这时$1
的值为"18005551212 ";而8005551212 将匹配失败,因为长度太短。
3.5 匹配前缀9,加上11位数字的号码
^9(d{11})$
比如说,918005551212
将匹配成功,这时$1
值为"18005551212";而8005551212 将匹配失败,因为长度太短。
3.6 匹配包含三位或四位数字的字符串
(^d{4}$|^d{3}$)
比如说,1001将匹配成功,这时$1
值为"1001";102也将匹配成功,
这时$1
值为"102";*9999将匹配失败;*98也将匹配失败。
3.7 匹配3到5位数字
(^d{3,5}$)
比如说,10010
将匹配成功,这时$1
值为"10010";102也将匹配成功,
这时$1
值为"102";*9999将匹配失败;*98也将匹配失败。
3.8 位数可变的匹配规则
下面表达式表示前缀 '9',后跟的数字位数是可变的:
^9(d+)$
比如说,977
将匹配成功,这时$1
值为"77";877将匹配失败;966736 将匹配成功,
这时$1
值为"66736";9118299983 将匹配成功,这时$1
值为"118299983";9将匹配失败,因为加号+表示至少一位。
3.9 际长途的国家代码
<extension name="international" continue="true">
<!--
^+(1| # NANPA
2[1-689]d| # 21X,22X,23X,24X,25X,26X,28X,29X
2[07]| # 20, 27
3[0-469]| # 30,31,32,33,34,36,39
3[578]d| # 35X,37X,38X
4[0-13-9]| # 40,41,43,44,45,46,47,48,49
42d| # 42X
5[09]d| # 50X, 59X
5[1-8]| # 51,52,53,54,55,56,57,58
6[0-6]| # 60,61,62,63,64,65,66
6[7-9]d| # 67X,68X,69X
7|
8[035789]d| # 80X,83X,85X,87X,88X,89X
8[1246]| # 81,82,84,86
9[0-58]| # 90,91,92,93,94,95,98
9[679]d # 96X,97X,99X
)(d+)
-->
<condition field="destination_number" expression="^+(1|2[1-689]d|2[07]|3[0-469]|3[578]d|4[0-13-9]|42d|5[09]d|5[1-8]|6[0-6]|6[7-9]d|7|8[035789]d|8[1246]|9[0-58]|9[679]d)(d+)">
<action application="set" data="country_code=$1"/>
<action application="set" data="national_number=$2"/>
</condition>
</extension>
3.10 NANPA +1NxxNxxXXXX E.164 拨号串
^(+1|1)?([2-9]dd[2-9]d{6})$
比如说,+13172222222将匹配成功;而13172222222依然会匹配成功;而3172222222还是会匹配成功,这是因为前缀+1或1是可选的;317122222将匹配失败,这不是合法NANPA号码。
3.11 LNP (本地号码)
^(?:1)?([2-9]d{2}[2-9]d{6})(?:;npdi=(?:yes|no))?(?:;rn=([2-9]d{2}[2-9]d{6}))?(?:;npdi=(?:yes|no))?
实例:
|
实例:
|
3.12 Clustering vs Capturing
有时候,你需要用圆括号对一系列选择进行分组,但是你对保存匹配的结果并不感兴趣。为了达成这个目的,你可以用问号加冒号组合。下面的实例,匹配前缀"+"或"00",但并不保存匹配的信息。第二组圆括号的匹配信息是有保存的。
^(?:+|00)(d+)$
比如说:+13171222222将匹配成功,这时$1的值为13171222222;而0013171222222也将匹配成功,这时$1的值还是13171222222。
下面这个实例,把匹配的结果分成前缀和电话号码两部分,分别存储在变量$1和$2里。
^(+|00)(d+)$
比如说,+13171222222匹配成功,这时$1的值为+,$2的值为13171222222; 0013171222222也匹配成功,这时$1的值为00,$2的值为13171222222。
圆括号可以嵌套。如果需要区分匹配的信息与变量的关系,可以从左到右展开圆括号。第一个开放的圆括号的信息存储为$1,第二个开放的则存储为$2,依此类推。
^((+|00)(d+))$
比如说,+13171222222匹配成功,这时$1值为+13171222222,$2值为+, $3值为13171222222; 0013171222222匹配成功,这时$1值为0013171222222,$2值为00, $3值为13171222222
下面再举个例子:不存储第一对圆护括号的匹配信息:
^(?:(+|00)(d+))$
比如说:+13171222222匹配成功,这时$1值为+, $2值为13171222222; 0013171222222也匹配成功,这时$1值为00, $2值为13171222222。
3.13 贪婪匹配
^rn=(.*);
比如说:rn=1234567890;匹配成功,这时$1值为1234567890;npdi
如果你的表达式里用的是.*?,那么将不会执行贪婪匹配(如果你匹配的是一个数字,也可以用d来描述)
^rn=(.*?);
比如说,rn=1234567890;npdi;匹配成功,这时$1值为1234567890
3.14 大小写不敏感
匹配时,如果对大小写不敏感,那么可以在匹配串加上前缀 (?i)
比如说:
(?i)restricted
这时,Restricted
和restricted均会匹配成功。
4. 延伸阅读
正则表达式是很严肃的事情。它们在计算机世界中用处很大。如果想进一步了解正则相关知识,这里给出一些相关的资源链接:
http://regexlib.com/Default.aspx
http://www.regular-expressions.info/
http://www.weitz.de/regex-coach/
http://regexlib.com/CheatSheet.aspx
http://www.zytrax.com/tech/web/regex.htm
http://oreilly.com/catalog/9781565922570/
http://perldoc.perl.org/perlreref.html
5. 测试你的正则表达式
5.1 利用fs_cli
请参考:https://freeswitch.org/confluence/display/FREESWITCH/mod_commands#mod_commands-regex
5.2 在线工具
- http://erik.eae.net/playground/regexp/regexp.html
- http://rubular.com
- http://scriptular.com/
5.3 简单 Perl 脚本校验
还可以使用下面的perl脚本测试正则表达式,或者根据需要对进行调整。
#!/usr/bin/perl
$x=$ARGV[0];
if($x=~/^(+1|1)?([2-9]dd[2-9]d{6})$/)
{
print "Input: $xn";
print "$1 Output: ".$1."n";
print "$2 Output: ".$2."n";
}
测试
|
|
6. 参考
在fs_cli 执行regex API命令进行正则匹配。
正则表达式备忘录:http://overapi.com/regex
最后
以上就是繁荣棉花糖为你收集整理的FreeSwitch的正则表达式实例1 摘要2 值的获取3 实例4. 延伸阅读 5. 测试你的正则表达式6. 参考的全部内容,希望文章能够帮你解决FreeSwitch的正则表达式实例1 摘要2 值的获取3 实例4. 延伸阅读 5. 测试你的正则表达式6. 参考所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复