找回密码
 加入
搜索
查看: 182|回复: 28

[网络通信] [已解决]请教一个正则表达式提取字符串的问题

[复制链接]
发表于 2025-5-23 14:11:47 | 显示全部楼层 |阅读模式
本帖最后由 邪恶海盗 于 2025-5-25 17:56 编辑
$a='级别 普通 [时间 19:30:32]'
$b='level most important [date time 3-1,05:42] finish'
$Rea=StringRegExp($a,'.+\h(.+)\]',1)
$Reb=StringRegExp($b,'.*\h+(.*)\]',3)
MsgBox(0,"",$Rea[0] & @LF & $Reb[0])
.+代表重复单字符,最小1次
\h代表空格
()代表包含
.*代表重复单字符,最小0次
\]代表]

这些都能理解,但放在一起完全看不懂,反正拼在一起能得到结果,谁能帮忙解释一下?

发表于 2025-5-23 15:37:22 | 显示全部楼层
其实第一个正则可以匹配上面信息
$a='级别 普通 [时间 19:30:32]'
$b='level most important [date time 3-1,05:42] finish'
$Rea=StringRegExp($a,'.+\h(.+)\]',3)
$Reb=StringRegExp($b,'.+\h(.+)\]',3)
;~ $Reb=StringRegExp($b,'.*\h+(.*)\]',3)
MsgBox(0,"",$Rea[0] & @LF & $Reb[0])
发表于 2025-5-23 15:41:24 | 显示全部楼层
#include <Array.AU3>
$string = _
'级别 普通 [时间 19:30:32] ' & @CRLF & _
'level most important [date time 3-1,05:42] finish'
Local $Array = StringRegExp($string, '.+\s(.+)\]' ,3)
For $i = 0 To UBound($Array) - 1
    
NEXT
;以下为测试结果:
If Not @Error Then   MsgBox(0, '匹配数量: ' & UBound($array), '其中$array[0]数组为: ' & $array[0])
_ArrayDisplay($Array, UBound($Array))
发表于 2025-5-23 15:45:06 | 显示全部楼层
\h代表空格,我在帮助里没查到,应是\s
 楼主| 发表于 2025-5-23 15:53:31 | 显示全部楼层
redapple2008 发表于 2025-5-23 15:45
\h代表空格,我在帮助里没查到,应是\s

\h 任何的水平空白字符.
\s 匹配任何的空白字符: Chr(9) 到 Chr(13).包括:水平制表符,换行,垂直列表符,换页,回车以及标准空格 ( Chr(32) ).

结果我得出来了,关键是怎么解释,也就是运行原理
发表于 2025-5-23 16:05:09 | 显示全部楼层
从字符串开始的位置进行匹配,找到 ] 符号前面 ,离开始位置最远的水平空白符    与   ]  之间的内容取出来。
发表于 2025-5-23 16:13:58 | 显示全部楼层
.+所有字符
\s空白字符
(.+)铺获组
\] 反义]

不知道这样理解对不对?
 楼主| 发表于 2025-5-23 16:19:59 | 显示全部楼层
haijie1223 发表于 2025-5-23 16:05
从字符串开始的位置进行匹配,找到 ] 符号前面 ,离开始位置最远的水平空白符    与   ]  之间的内容取出来 ...

意思是.+代表的是所有字符,加上\h代表查找到最后一个空格位置?
发表于 2025-5-23 16:27:07 | 显示全部楼层
邪恶海盗 发表于 2025-5-23 16:19
意思是.+代表的是所有字符,加上\h代表查找到最后一个空格位置?

.+\h(.+)\]
任意字符到最远的 \h (任意字符) ]
这样能理解吗
 楼主| 发表于 2025-5-23 16:35:09 | 显示全部楼层
haijie1223 发表于 2025-5-23 16:27
.+\h(.+)\]
任意字符到最远的 \h (任意字符) ]
这样能理解吗

把“任意”改成“所有”会不会更精确一些?
 楼主| 发表于 2025-5-23 16:36:10 | 显示全部楼层
redapple2008 发表于 2025-5-23 16:13
.+所有字符
\s空白字符
(.+)铺获组

我感觉没错,正则太伤脑筋了...
发表于 2025-5-23 16:36:14 | 显示全部楼层
邪恶海盗 发表于 2025-5-23 16:35
把“任意”改成“所有”会不会更精确一些?

这个随意,只要能理解就行
 楼主| 发表于 2025-5-23 16:39:41 | 显示全部楼层
haijie1223 发表于 2025-5-23 16:36
这个随意,只要能理解就行

不不不,你不要欺负我们这些菜鸡,如果是.你说是任意字符可以理解,如果是.+或者.*代表重复任意字符,也就是所有字符的意思,如果也解释成“任意字符”则容易产生是单个字符的误区...
 楼主| 发表于 2025-5-23 17:00:23 | 显示全部楼层
还有这个重复用*还是+更合适?
发表于 2025-5-23 20:32:22 | 显示全部楼层
* + 都是贪婪模式(尽可能多的匹配),前者可以匹配空,后者至少匹配一个字符
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2025-6-2 21:14 , Processed in 0.217298 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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