正则替换Ex、正则全局匹配模式

在字符串处理方面,正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本,是非常方便强大的。AutoHotkey自带的RegExMatch没有全局模式,RegExReplace也不能对匹配的子串进行计算后替换,以下2个函数增加这两个功能。

/************************************************************************
 * @file: RegEx.ah2
 * @description: 正则函数扩展,RegExReplaceEx、RegExMatchAll
 * @author thqby
 * @date 11/23/2020
 * @version 1.0
 ***********************************************************************/

/**
 * @description 正则替换加强版,支持匹配项计算
 * @param Haystack: string 需要替换的字符串
 * @param NeedleRegEx: string 正则表达式
 * @param CallBack: funcobj 回调函数,参数Match对象,返回值计算后的字符串
 * @param Limit: integer 允许替换的最大次数
 * @param StartingPosition: integer
 * @return string 返回 Haystack 被替换之后的值
 */
RegExReplaceEx(Haystack, NeedleRegEx, CallBack, Limit := -1, StartingPosition := 1) {
	LastFoundPos := 1, Ret := '', RegExReplace(Haystack, NeedleRegEx '(?CCallout)', '', , Limit, StartingPosition)
	return Ret SubStr(Haystack, LastFoundPos)
	Callout(Match, CalloutNumber, FoundPos, *) => (Ret .= SubStr(Haystack, LastFoundPos, FoundPos - LastFoundPos) CallBack.Call(Match), LastFoundPos := FoundPos + StrLen(Match[0]), 0)
}

/**
 * @description 正则全局模式,返回所有匹配项
 * @param Haystack: string 需要替换的字符串
 * @param NeedleRegEx: string 正则表达式
 * @param StartingPosition: integer
 * @return array | 0 返回所有匹配项数组,无匹配项时返回0
 */
RegExMatchAll(Haystack, NeedleRegEx, StartingPosition:=1){
	Matchs := [], RegExReplace(Haystack, NeedleRegEx '(?CCallout)', , , , StartingPosition)
	return Matchs.Length ? Matchs : 0
	Callout(Match, *) => (Matchs.Push(Match), 0)
}

示例:

正则匹配全局模式

; 返回所有匹配项的RegExMatch对象数组
m:=RegExMatchAll('312gs43gt536bfg5', '\d+')
; [{0:'312'},{0:'43'},{0:'536'},{0:'5'}]

对匹配项计算后替换

; 字符串中的整数部分*2
msgbox RegExReplaceEx('312gs43gt536bfg5', '\d+', (m)=>m[0]*2)
; 624gs86gt1072bfg10

; 单词首字母大写
msgbox RegExReplaceEx('The_quick_brown_fox_jumps_over_the_lazy_dog', 'i)[a-z]+', (m)=>StrUpper(m[0], "T"))
; The_Quick_Brown_Fox_Jumps_Over_The_Lazy_Dog


; 简单字符串计算
msgbox RegExReplaceEx('87*324=', '(\d+)\*(\d+)=', (m)=>m[0] (m[1]*m[2]))
; 87*324=28188

给TA捐赠
共{{data.count}}人
人已捐赠
其他教程

使Array数组对象以0为第一个元素, ComObjArray以1为第一个元素

2020-11-24 10:14:00

其他函数教程

【函数】检索剪贴板中的文件是否来自资源管理器剪切或复制操作

2020-11-24 14:57:12

3 条回复 A文章作者 M管理员
  1. 星星雨

    感谢提供分享

个人中心
购物车
优惠劵
有新私信 私信列表
搜索