鱼C论坛

 找回密码
 立即注册
查看: 2035|回复: 4

[已解决]【简单正则表达式】

[复制链接]
发表于 2022-8-15 13:28:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hello? 于 2022-8-15 13:33 编辑
"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"
请问这个正则表达式是什么意思
谢谢大佬们帮助
最佳答案
2022-8-15 17:19:11
"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"

这个正则表达式拆分开来一个一个看
第一部分:
\s*
它表示匹配零个或多个空白字符,例如空格、制表符、回车符等等

第二部分:
(?P<header>[^:]+)
其实这个部分开可以进一步拆分,但是因为它们在逻辑上是一个整体我就不进一步拆分了。
(?P<header>)是一个带有名字的分组,名字叫做header,匹配字符串的时候用不到这个名字,获取匹配结果的时候才用得到。
这个分组真正要匹配的是[^:]+,中括号表示自定义字符范围,例如[abc]就可以匹配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'  # 不是英文冒号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-15 17:19:11 | 显示全部楼层    本楼为最佳答案   
"\s*(?P<header>[^:]+)\s*:(?P<value>.*?)\s*$"

这个正则表达式拆分开来一个一个看
第一部分:
\s*
它表示匹配零个或多个空白字符,例如空格、制表符、回车符等等

第二部分:
(?P<header>[^:]+)
其实这个部分开可以进一步拆分,但是因为它们在逻辑上是一个整体我就不进一步拆分了。
(?P<header>)是一个带有名字的分组,名字叫做header,匹配字符串的时候用不到这个名字,获取匹配结果的时候才用得到。
这个分组真正要匹配的是[^:]+,中括号表示自定义字符范围,例如[abc]就可以匹配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'  # 不是英文冒号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-8-15 19:43:08 | 显示全部楼层
Brick_Porter 发表于 2022-8-15 17:19
这个正则表达式拆分开来一个一个看
第一部分:

十分感谢大佬,不过问号那里匹配尽可能少的的字符不是很理解,能举个例子吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-15 21:55:49 | 显示全部楼层
本帖最后由 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。既然不想匹配,那干脆就不要写入正则表达式,还可以降低理解难度。正因为如此??很少用到。

正则表达式不是一种正规的编程语言,所以它也不像编程语言一样严谨。正则表达式的难点之一就是如何排除不想匹配的结果,非贪婪匹配就是方法之一。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-15 23:03:16 | 显示全部楼层
Brick_Porter 发表于 2022-8-15 21:55
我猜你会在这个问题上有疑惑,但考虑到当时主要解释解释正则表达式的作用所以没有过多说明。

这次专 ...

明白了!非常感谢大佬,很少遇见像你这么耐心的
不过小白还有一个小问题,大佬有空帮我看看,谢谢,简单回答就行


刚开始在力扣刷题的疑问
https://fishc.com.cn/thread-216644-1-1.html
(出处: 鱼C论坛)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-29 12:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表