我是靠谱客的博主 繁荣棉花糖,最近开发中收集的这篇文章主要介绍FreeSwitch的正则表达式实例1 摘要2 值的获取3 实例4. 延伸阅读 5. 测试你的正则表达式6. 参考,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

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))?

实例:

6045555555;npdi=yes;rn=7785550001

6045555555;rn=7785550001;npdi=yes

16045555555;npdi=yes;rn=7785550001

6045555555;rn=7785550001

Result:

$1=6045555555

$2=7785550001

实例:

6045555555

16045555555

6045555555;npdi=yes

6045555555;npdi=no

Result:

$1=6045555555

$2=empty

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";
}
测试

# perl x.pl 12135551212

Input: 12135551212

$1 Output: 1

$2 Output: 2135551212

 

# perl x.pl +12135551212

Input: +12135551212

$1 Output: +1

$2 Output: 2135551212

 

# perl x.pl 2135551212 

Input: 2135551212

$1 Output:

$2 Output: 2135551212

 

6. 参考

        在fs_cli 执行regex API命令进行正则匹配。

        正则表达式备忘录:http://overapi.com/regex

 

最后

以上就是繁荣棉花糖为你收集整理的FreeSwitch的正则表达式实例1 摘要2 值的获取3 实例4. 延伸阅读 5. 测试你的正则表达式6. 参考的全部内容,希望文章能够帮你解决FreeSwitch的正则表达式实例1 摘要2 值的获取3 实例4. 延伸阅读 5. 测试你的正则表达式6. 参考所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部