如何构建多行正则表达式捕获未调用.appFont的Text声明?
多行正则匹配未添加
.appFont的Text声明 需求明确
需要构建正则满足:
- 匹配以
Text(开头的代码片段 - 该片段在遇到下一个
}(函数结束)或另一个Text(之前,完全不包含.appFont(调用
现有正则的问题分析
- 第一个正则
Text\([\s\S]*?\)[\s\S]*?(?!\.appFont):
这里的负向预查是零宽断言,只会匹配到.appFont出现前的内容,无法实现“存在.appFont则整个匹配失败”的要求。 - 第二个正则
Text\([\s\S]*?\)[\s]*?(?!appFont)[\s\S]\}:
逻辑结构混乱,[\s]*?(?!appFont)仅检查当前位置后无appFont,但后续的[\s\S]\}会强制匹配任意字符加},完全忽略了.appFont的存在。
正确正则方案
Text\([\s\S]*?\)(?:(?!\.appFont|Text\(|})[\s\S])*\}
正则逻辑拆解
Text\([\s\S]*?\):匹配完整的Text(...)声明,支持多行写法(比如Text(后换行写字符串)(?:(?!\.appFont|Text\(|})[\s\S])*:核心的负向预查循环(?!\.appFont|Text\(|}):每次匹配任意字符前,先断言当前位置后不会出现.appFont、新的Text(或结束符}[\s\S]:匹配任意字符(包括换行)- 整个循环确保从
Text(...)结束后,到}或新Text(之前,全程没有.appFont
\}:匹配函数结束的},锁定匹配范围
示例验证
针对你提供的代码片段:
// 情况1:包含.appFont,不匹配 Text("blah") .appFont(.body) } // 情况2:无.appFont,会被匹配 Text("blah") } // 情况3:包含.appFont,不匹配 Text( "blah" ) .appFont(.blah) }
只有第二种情况会被正则成功捕获,符合需求。
内容的提问来源于stack exchange,提问作者Aviel Gross
相关产品推荐
相关产品推荐

