找回密码
 加入
搜索
查看: 37|回复: 17

[AU3基础] 请教一个正则表达式提取字符串的问题

[复制链接]
发表于 昨天 14:11 | 显示全部楼层 |阅读模式
本帖最后由 邪恶海盗 于 2025-5-23 14:13 编辑
$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次
\]代表]

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

发表于 昨天 15:37 | 显示全部楼层
其实第一个正则可以匹配上面信息
$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])
发表于 昨天 15:41 | 显示全部楼层
#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))
发表于 昨天 15:45 | 显示全部楼层
\h代表空格,我在帮助里没查到,应是\s
 楼主| 发表于 昨天 15:53 | 显示全部楼层
redapple2008 发表于 2025-5-23 15:45
\h代表空格,我在帮助里没查到,应是\s

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

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

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

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

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

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

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

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

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

本版积分规则

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

GMT+8, 2025-5-24 13:01 , Processed in 0.199625 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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