如何将获取正则匹配结果的Objective-C代码改写为AppleScript代码
AppleScriptObjC 实现正则匹配获取分组范围的正确写法
首先你需要确保脚本是 AppleScriptObjC 类型,开头必须引入 Foundation 框架,以下是完整可运行的改写代码:
-- 必要框架引入,放在脚本最开头 use framework "Foundation" use scripting additions -- 1. 定义原始字符串和正则表达式 -- 注意:AppleScript 字符串中反斜杠需要双写转义,示例正则设置了两个捕获组,对应你要取的index1、index2 set originalString to "hello world" set regexPattern to "(\\w+) (\\w+)" -- 2. 初始化正则对象 set regex to current application's NSRegularExpression's regularExpressionWithPattern:regexPattern options:0 |error|:(missing value) -- 3. 执行匹配,不需要强转为list,返回结果是NSTextCheckingResult实例或missing value set firstMatch to regex's firstMatchInString:originalString options:0 range:{location:0, |length|:(count originalString)} -- 4. 匹配成功后获取对应范围 if firstMatch is not missing value then -- 整个匹配的范围,返回{location:xxx, |length|:xxx}格式的记录 set matchRange to firstMatch's |range|() -- 第一个捕获组的范围 set firstHalfRange to firstMatch's rangeAtIndex:1 -- 第二个捕获组的范围 set secondHalfRange to firstMatch's rangeAtIndex:2 -- 额外补充:如果要基于这个范围截取AppleScript原生字符串,需要转换索引(NSRange从0开始,AppleScript字符串从1开始) set matchStart to (location of matchRange) + 1 set matchEnd to (location of matchRange) + (|length| of matchRange) set matchContent to text matchStart thru matchEnd of originalString end if
关键修正说明
- 不需要将
firstMatchInString的返回结果强转为list,它本身是NSTextCheckingResult类型的实例,直接调用它的实例方法即可 - 你漏了正则对象的初始化步骤,不能直接用正则字符串调用匹配方法,需要先初始化
NSRegularExpression实例 - AppleScript 中调用属性、方法如果和系统关键字重名需要用竖线包裹,比如
|range|()、|length| - 正则表达式中的转义符在AppleScript字符串里需要双写,比如
\w要写成\\w,\d要写成\\d
内容的提问来源于stack exchange,提问作者user3579815
相关产品推荐
相关产品推荐

