左小白的技术日常
Github

正则表达式使用 () 和 match 或 replace 提取 url 路径参数

这篇文章发布于 2021/05/04,归类于
标签:
正则提取 url 参数

来看一个问题,使用正则表达式从 url 中提取区域、城市id、模块、页数id。url 示例如下

  1. http://www.xx.com/region/gd/module
  2. http://www.xx.com/region/gd-c222/module
  3. http://www.xx.com/region/gd-c222/module/p2

下面来看看怎么实现

首先,回顾下正则表达式(Regular Expression)基础。正则表表达式以 /pattern/flags 表示,是 RegExp 对象的实例

/[a-z]*/g instanceof RegExp // true

pattern 模式由下面的字符组成

flags 标志位:g 不仅仅匹配第一个,全局匹配。i 忽略大小写

正则表达式中,一个 () 表示一个部分,来看一个例子。

let str = "zuo guoqing"
let reg = /(\w+)\s(\w+)/ // 匹配两个部分 '第一部分 第二部分'
str.replace(reg, "$2 $1") // 将两个部分对调,"guoqing zuo"
str.match(reg) // { 0: "zuo guoqing", 1: "zuo", 2: "guoqing" }
reg.exec(str) // { 0: "zuo guoqing", 1: "zuo", 2: "guoqing" }

现在我们可以使用 () 来分部分(块)提取 url 中的字符了,将 url 拆解 .com之前的部分\/区域部分\/城市以及id部分\/模块部分\/页数部分

// .com 之前的部分 [\S]+.com\/  匹配一个或多个非空白符.com\/
// 区域部分 ([\w]*)\/ 匹配 0 个 或多个 数字字母下划线
// 城市及id部分 ([\w-]*)\/ 匹配 0 个或多个 数字字母下划线 -
// 模块部分 ([\w]*)\/?
// 页数部分 ([\w]*)$
let regExp = /[\S]+.com\/([\w]*)\/([\w-]*)\/([\w]*)\/?([\w]*)$/
let a = `http://www.xx.com/region/gd/module`
let b = `http://www.xx.com/region/gd-c222/module`
let c = `http://www.xx.com/region/gd-c222/module/p2`
a.replace(regExp, '$1 $2 $3 $4') // "region gd module "
b.replace(regExp, '$1 $2 $3 $4') // "region gd-c222 module "
c.replace(regExp, '$1 $2 $3 $4') // "region gd-c222 module p2"
a.match(regExp) // { 1: "region", 2: "gd", 3: "module", 4: "" }
c.match(regExp) // { 1: "region", 2: "gd-c222", 3: "module", 4: "p2" }