首页
正则表达式位置匹配——匹配两个特殊符号中间的内容

需求

对于下面的一串字符,需要匹配{}中间的内容

user = {name: "Jack", age: 18}

case 1:匹配 {} 中间的内容,并且包含 {} 本身

{.*}

image_1efr0p94hrrli5q108416tp1qb9m.png-15.4kB

解析:

  • { 匹配 { 本身
  • . 匹配任何字符,除了\n换行符
  • * 匹配前面的子表达式 0 次或多次
  • } 匹配 } 本身

case 2:匹配 {} 中间的内容,包含 { 但不包含 }

{.*(?=})

image_1efr116at1g5t1t231ght1bem1ceh13.png-15.4kB

解析:

前面的跟上面一样,} 变成了 (?=})。这里用到了一个(?=p)的语法,其中 p 是一个子模式,即 p前面的位置。

case 3:匹配 {} 中间的内容,包含 } 但不包含 {

(?<={).*}

image_1efr187na7jtuhc1ldo138p1tvn1g.png-14.6kB

解析:

跟上一种情况相反。后面的 } 不变,前面的 { 变成了 (?<={)。这里用到了一个 (?<=p) 的语法,其中 p 是一个子模式,即 p 后面的位置。

case 4:匹配 {} 中间的内容,不包含 {} 本身

(?<={).*(?=})

image_1efr1jb7vssm1c0b1hk68g2nrp1t.png-15.7kB

解析:

结合上面两种情况,就可以得出这样的正则表达式。

升级的需求

上面的需求,我们发现是一行语句,如果是多行的匹配呢?同样是匹配 {} 中间的内容,现在变成了多行。

__GetZoneResult_ = {
    mts:'1872917',
    province:'陕西',
    catName:'中国移动',
    telString:'18729172911',
	areaVid:'30503',
	ispVid:'3236139',
	carrier:'陕西移动'
}

前面的 .* 是匹配除了\n以外的任意字符0次或多次。我们需要改成匹配任意字符0次或多次即可,所以不能用 . 了。

那么,在正则表达式中使用什么可以匹配到所有字符呢?我们可以使用几种元字符的组合。比如:\d 是匹配一个数字字符,\D 是匹配一个非数字字符。那么 [\d\D] 的组合就可以匹配所有字符了。同样的还有以下的组合:

  • [\w\W]
  • [\s\S]

image_1efr2evks1vclfmkf6snugokc2a.png-43.2kB

使用位置匹配

对于上面的需求,我们使用位置匹配也可以达到这样的要求。我们需要借助 ^ 的特性。

image_1efr3ccg3i881fc7rgpm716r634.png-42kB
image_1efr3a3l15gu1pdf1ltlr7mk8c2n.png-13.4kB

[^] 是一个比较神奇的操作,因为 [] 里没有字符集合,不接受没有字符集合那就是所有了。我们可以试验一下,随便写一串字符,用 [^] 可以匹配到所有。

image_1efr3knl0eha1jgnbif1voi1m773h.png-33.7kB

参考:

  1. 正则表达式*和+的区别
  2. 正则表达式 - 语法
  3. 正则表达式位置匹配攻略