AHK中遍历正则Match Object捕获组:获取匹配总数及数组优化
AutoHotkey 正则匹配转带引号数组的问题解决
你的代码存在的问题
- 正则匹配未全局遍历:
RegExMatch默认只匹配一次,你用O选项拿到的只是第一个匹配结果,循环max_index根本获取不到后续的域名/IP。 - 数组被错误覆盖:你一开始定义了数组
lab_list_array := [],但后续直接赋值为字符串lab_list_array := "" lab_list[A_index] "",直接丢弃了数组结构。 - 语法错误:
if [A_index] != %max_index%写法错误,正确的表达式判断应该是if (A_index != max_index)。 - 正则表达式缺陷:IP 部分的
.未转义(\\d{1,3}.\\d{1,3}),这里的.会匹配任意字符,不是点号,需要改成\\.。
正确实现方案
方案一:先收集所有匹配到数组,再生成带引号的字符串
这种方式清晰直观,便于后续对数组做其他操作:
; 初始化空数组 lab_list_array := [] haystack := "lab.website.int, abc.demo.company.com, product.eu.company.com, 10.199.1.1" ; 修正后的正则:IP部分点转义,确保只匹配点号 regex_pattern := "O)(([a-zA-Z0-9-]{1,63}\\.+)[a-zA-Z]{2,63}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" pos := 1 ; 循环调用RegExMatch,遍历所有匹配项 while RegExMatch(haystack, regex_pattern, match, pos) { ; 去掉匹配项前后的空格(原字符串逗号后有空格),加入数组 lab_list_array.Push(Trim(match[0])) ; 移动到下一个匹配的起始位置 pos := match.Pos + match.Len } ; 生成带引号的逗号分隔字符串 result := "" loop, % lab_list_array.Length() { result .= """" lab_list_array[A_Index] """" ; 最后一个元素后不加逗号 if (A_Index != lab_list_array.Length()) { result .= "," } } ; 输出结果 MsgBox % result
这里 lab_list_array.Length() 就是你要的匹配总数,直接替代原来的 max_index 即可。
方案二:用 RegExReplace 直接生成目标字符串(更简洁)
如果不需要保留数组,只是要生成带引号的逗号分隔字符串,可以一步到位:
haystack := "lab.website.int, abc.demo.company.com, product.eu.company.com, 10.199.1.1" regex_pattern := "([a-zA-Z0-9-]{1,63}\\.+)[a-zA-Z]{2,63}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" ; 直接替换每个匹配项为带引号的格式,同时保留逗号分隔 result := RegExReplace(haystack, "\s*(" regex_pattern ")\s*(,|$)", """$1""$2") MsgBox % result
解释:\s* 匹配匹配项前后的空格,$1 指代匹配到的域名/IP,$2 指代原有的逗号或者字符串结尾,确保格式正确。
内容的提问来源于stack exchange,提问作者wetin
相关产品推荐
相关产品推荐

