- "\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"
复制代码
这个正则表达式拆分开来一个一个看
第一部分:
它表示匹配零个或多个空白字符,例如空格、制表符、回车符等等
第二部分:
其实这个部分开可以进一步拆分,但是因为它们在逻辑上是一个整体我就不进一步拆分了。
(?P<header>)是一个带有名字的分组,名字叫做header,匹配字符串的时候用不到这个名字,获取匹配结果的时候才用得到。
这个分组真正要匹配的是[^:]+,中括号表示自定义字符范围,例如[abc]就可以匹配a或者b或者c,请注意它只匹配
一个字符。
中括号中用插入符号(^)开头表示排除的意思,所以[^abc]的意思是匹配除了a、b、c之外的任意一个字符。
前面说过中括号这种语法只匹配一个字符,如果要使用这种模式匹配多个字符怎么办呢?使用量词就行了。量词包括*(0次到无穷多次)、+(1次到无穷多次)和?(0次或1次)。
所以合在一起(?P<header>[^:]+)的意思就是:匹配至少1个除了冒号以外的任意字符,并且把匹配结果保存在名为header的组中
第三部分:
这个可以参考前面的第一部分,首先匹配0个或任意个空白字符,紧跟在后面的是一个冒号,按照字面意思匹配冒号。
第四部分:
这个部分和第二部分一样也是一个带有名字的分组,这次的名字是value。这个分组真正匹配的是.*?,这是一个常用的写法,用于匹配任意数量的任意字符,而且是尽可能少的匹配。因为点号(.)可以匹配任意一个字符,星号(*)前面解释过是量词表示任意数量,最后的问号(?)在这里不是量词而是匹配尽可能少的字符的意思。
所以这个部分的意思是把匹配的结果保存在一个名为value的组中。
第五部分:
这也是最后一部分了,它的意思是匹配一行末尾的0个或无穷多个空白字符。注意最后的美元符号($)表示一行末尾这个位置,它只匹配位置不匹配字符。
综合来说,这个正则表达式可以匹配如下字符串:
- ' abc: 16' # header=abc, value=16
- '"good":true' # header="good", value=true
- '2.718: 666 ' # header=2.718 value=666
复制代码
但是不能匹配下面这些字符串:
- 'hahaha 1111' # 没有冒号
- ' 123 456' # 没有冒号
- ' aaa: ccc' # 不是英文冒号
复制代码