巧用正则表达式来提取URL中的业务字段

版权声明:本文为神州灵云作者的原创文章,未经神州灵云允许不得转载。

本文作者:Joy

正则表达式广泛应用于文本、字符串搜索和替换,其功能非常强大,能够高效的解决很多繁琐且困难的问题。但它并不完美,其最大的缺点就是看上去很难学,让很多对它感兴趣的人,只看它一眼便决定放弃。事实上,这是对它的误解。
正则表达式的基本语法和特殊符号并不多,特别是经常用到的就更少了。就像是了解了“加减乘除”,解出一个“四则混合运算”的表达式,只是时间问题一样。至于那些高阶用法,数量不多,理解不难,几乎用不到,可以不用理会,就算用到现学也不会花太多时间。

大部分情况下,正则表达式只是“二则混合运算”,而且这两种基本语法都很简单,是不是有点小意外呢。
举个例子:0[0-9]{2,3}-[0-9]{7,8}
看上去略显复杂,但这个正则表达式只包含两种语法。方括号“[]”表示字符多选一,如“[12-4]”表示数字“1、2、3、4”中任意一个,“[Ab-d]”表示字母“A、b、c、d”中任意一个。花括号“{n,m}”表示前一个字符重复至少n次、至多m次。了解了这两种语法,再来看这个例子就容易理解了,这是一个匹配电话号码的正则表达式。区号部分"0"开始"-“结束,中间二或三位数字,其后是七或八位的电话号码。
看到这里,你已经有了扎实的基本功了,你已经可以写出可以应付大部分需求的正则表达式了。什么?别人写的你看不懂?哦,那可能是一些机智(wuliao)的开发者为了书写方便(jiushizhuangbi),搞出来一些所谓的缩写形式。比如上面的例子也可以写成: 0\d{2,3}-\d{7-8},”\d"代表任一数字。类似的缩写还有一些,如下:

  1. “\d”: 匹配数字
  2. “\w”: 匹配字母,数字,下划线
  3. “\s”: 匹配空格
  4. “.”: 匹配除了换行符以外的任何字符
  5. “\b”: 不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中"This is Regex"匹配单独的单词 “is” 正则就要写成 “\bis\b”。 \b 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界
  6. “\W”: 匹配任意不是字母,数字,下划线 的字符
  7. “\S”: 匹配任意不是空白符的字符
  8. “\D”: 匹配任意非数字的字符
  9. “\B”: 匹配不是单词开头或结束的位置
  10. “[^abc]”: 匹配除了abc以外的任意字符

这些缩写有时候是提供了一些方便。
什么,还是看不懂别人写的正则表达式?那大概是花括号被缩写了,不要慌,马上解密。

  1. “{n,m}”: 重复n到m次,贪婪模式(最长匹配)
  2. “{n,m}?”: 重复n到m次,非贪婪模式(最短匹配)
  3. “{n}”: 重复n次
  4. “{n,}”: 重复至少n次
  5. “*”: 重复零次或更多,贪婪模式
  6. “+”: 重复一次或更多次,贪婪模式
  7. “?”: 重复零次或一次

另外,还有两个符号需要了解一下:

  1. “^”: 匹配字符串的开始位置
  2. “$”: 匹配字符串的结束位置
    好了,看到这里,你已经毕业了。
    什么,不相信?还有看不懂的正则表达式?遇到一些高阶用法,写这个表达式的人,也是查着资料写的,查查资料,你也行!
    下面就来看看我们的NPM/BPM产品中,是如何使用正则表达式的吧。正则表达式主要应用于七层协议分析的:HTTP Pattern,URL Pattern和TCP String Pattern的字符串匹配和获取中。
  3. 匹配:命中返回true,否则返回false。
  4. 获取:命中返回子串,否则返回空。
    比如:
  5. “.*”: 任意字符重复任意次
    a) 匹配所有字符串。
    b) 获取整个字符串。
  6. “google”
    a) 匹配包含"google"的字符串。
    b) 获取任意位置的"google"。
  7. “^www”:
    a) 匹配以"www"开头的字符串。
    b) 获取开头位置的"www"。
  8. “\d+”:
    a) 匹配长度大于等于1的数字串。
    b) 获取长度大于等于1的数字串。

常言道:光说不练假把式。下面来看一个例子。
在一个项目中,需要从路径参数“opCode”中提取4位数字的“功能号”信息,但这个路径参数的格式并不固定,已知的格式有如下几种:

  1. opCode=8250%3Fwt.ac*(“*”号表示省略多个字符)
  2. opCode=p8250%3Fwt.ac*

以上这两种情况虽然只是相差一个字母“p”,但是这导致“功能号”的偏移量和起始符都发生了变化,所以既不能按偏移量来定位,也不能按关键字来检索。对于已经学会了正则表达式的你来讲,这当然构不成任何威胁,看到这种情况,你甚至还露出了一丝微笑。只需要配置一个最基本的正则表达式“\d{4}”,即可提取出这个走位飘逸的“功能号”,纯粹的数字不掺杂一个字母,精确的个数不会有半点误差。

需要注意的是,字符“\”需要转义,所以这个正则表达式在探针上应该配置为:“\d{4}”。可以通过Fig.3中的方法来验证配置的正则表达式。

输出结果中:

  1. “Matched”:表示命中。若未命中,则输出“Unmatched”。

  2. “(0, 4)”和“(1, 5)”:表示命中字符的起止偏移量。

  3. “8250”:表示提取的目标字符串。
    综上所述,功能强大的正则表达式,使用起来并不复杂,却能覆盖极广的使用场景。在NPM/BPM产品中引入正则表达式,也正是这个原因。

  4. 避免转义字符。如前文所述,正则表达式有其特有的一套转义字符,如果对这些不是很熟悉,可能会踩坑。

  5. 符号“+”表示提取至少1位。如果出现并非4位的“功能号”,也能正常提取。
    注意,Fig.4中的“目标序号”设置, 是指提取第一个数字序列。

纯数字的“功能号”究竟代表什么样的功能,很不直观,那么就需要在业务定义配置页面,为每个“功能号”取一个新的名称,如Fig.5所示。

大功告成!去BPM详单分析页面验收吧,每一笔业务的交互信息都非常清晰直观的展示出来(Fig.6)。这种方法不仅仅适用于获取“功能号”,也可以获取其他任何需要的信息。

你可能感兴趣的:(巧用正则表达式来提取URL中的业务字段)