【简单正则表达式】
本帖最后由 hello? 于 2022-8-15 13:33 编辑"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"
请问这个正则表达式是什么意思
谢谢大佬们帮助 "\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"
这个正则表达式拆分开来一个一个看
第一部分:
\s*
它表示匹配零个或多个空白字符,例如空格、制表符、回车符等等
第二部分:
(?P<header>[^:]+)
其实这个部分开可以进一步拆分,但是因为它们在逻辑上是一个整体我就不进一步拆分了。
(?P<header>)是一个带有名字的分组,名字叫做header,匹配字符串的时候用不到这个名字,获取匹配结果的时候才用得到。
这个分组真正要匹配的是[^:]+,中括号表示自定义字符范围,例如就可以匹配a或者b或者c,请注意它只匹配一个字符。
中括号中用插入符号(^)开头表示排除的意思,所以[^abc]的意思是匹配除了a、b、c之外的任意一个字符。
前面说过中括号这种语法只匹配一个字符,如果要使用这种模式匹配多个字符怎么办呢?使用量词就行了。量词包括*(0次到无穷多次)、+(1次到无穷多次)和?(0次或1次)。
所以合在一起(?P<header>[^:]+)的意思就是:匹配至少1个除了冒号以外的任意字符,并且把匹配结果保存在名为header的组中
第三部分:
\s*:
这个可以参考前面的第一部分,首先匹配0个或任意个空白字符,紧跟在后面的是一个冒号,按照字面意思匹配冒号。
第四部分:
(?P<value>.*?)
这个部分和第二部分一样也是一个带有名字的分组,这次的名字是value。这个分组真正匹配的是.*?,这是一个常用的写法,用于匹配任意数量的任意字符,而且是尽可能少的匹配。因为点号(.)可以匹配任意一个字符,星号(*)前面解释过是量词表示任意数量,最后的问号(?)在这里不是量词而是匹配尽可能少的字符的意思。
所以这个部分的意思是把匹配的结果保存在一个名为value的组中。
第五部分:
\s*$
这也是最后一部分了,它的意思是匹配一行末尾的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'# 不是英文冒号 Brick_Porter 发表于 2022-8-15 17:19
这个正则表达式拆分开来一个一个看
第一部分:
十分感谢大佬,不过问号那里匹配尽可能少的的字符不是很理解,能举个例子吗 本帖最后由 Brick_Porter 于 2022-8-15 21:59 编辑
hello? 发表于 2022-8-15 19:43
十分感谢大佬,不过问号那里匹配尽可能少的的字符不是很理解,能举个例子吗
我猜你会在这个问题上有疑惑,但考虑到当时主要解释解释正则表达式的作用所以没有过多说明。
这次专门来解释问号(?)的用法,问号主要有两种用途。
第一种是作为量词使用,表示0次或1次,作用范围是前一个字符。例如:
backs?
问号的前一个字符是字母s,所以以上正则表达式可以匹配back或者backs
第二种作用是非贪婪匹配。一般来说,我们使用量词(*、+、?)时这些量词会让正则表达式尽可能多地匹配字符,也就是尽可能“贪婪”地匹配字符。例如:
ba+
上述正则表中量词+(匹配1次或无穷多次)的前面一个字符是a所以正则引擎在匹配字符串时至少匹配一个a,如果b后面不止一个a那么这些a都会被匹配。
这种尽可能多地匹配的方式有时候会引发问题,那就是匹配了不需要的内容。例如:
s.*f
点号(.)匹配除了换行符以外的任意字符,此外量词*表示匹配0次或无穷多次,而且是贪婪匹配,所以这个这则表达式会匹配s开头到f结尾的字符串。
对于字符串'spam bar baz foo fuz'来说,上述正则表达式会匹配'spam baz foo f',因为贪婪匹配的关系所以第一个foo被完整包括在内,但是如果我们只想匹配到foo的f就停下不要继续匹配又该怎么办呢?此时就需要非贪婪匹配了。
非贪婪匹配的写法也很简单,在量词(*、+、?)的后面再跟上一个问号即可,也就是说非贪婪匹配有三种写法*?、+?、??。
*?表示尽量匹配0次,条件允许的情况下也会匹配多次;
+?表示尽量匹配1次,同样如果条件允许匹配多次;
??问号本身表示匹配0次或1次,再加一个问号变为非贪婪匹配就是说尽量匹配0次,也就是不要匹配前一个字符。例如ba??就只会匹配一个字母b。既然不想匹配,那干脆就不要写入正则表达式,还可以降低理解难度。正因为如此??很少用到。
正则表达式不是一种正规的编程语言,所以它也不像编程语言一样严谨。正则表达式的难点之一就是如何排除不想匹配的结果,非贪婪匹配就是方法之一。 Brick_Porter 发表于 2022-8-15 21:55
我猜你会在这个问题上有疑惑,但考虑到当时主要解释解释正则表达式的作用所以没有过多说明。
这次专 ...
明白了!非常感谢大佬,很少遇见像你这么耐心的{:10_275:}
不过小白还有一个小问题,大佬有空帮我看看,谢谢,简单回答就行{:10_266:}
刚开始在力扣刷题的疑问
https://fishc.com.cn/thread-216644-1-1.html
(出处: 鱼C论坛)
页:
[1]