求用于Dart宏生成器的正则表达式:匹配无前缀转义符\的&param子串
解决方案:带转义排除的正则替换
嘿,这个转义逻辑的需求挺常见的,我来帮你搞定!要实现你要的效果,关键是用负向零宽后行断言来精准匹配那些前面没有未被转义反斜杠的&param子串。
正则表达式与Dart实现
直接上可运行的代码,这是满足你需求的完整实现:
void main() { String originalStr = "My name is &param and my parameter is called \\&param."; // 核心正则:用负向断言排除前置反斜杠的情况 final targetRegex = RegExp(r'(?<!\\)&param'); String result = originalStr.replaceAll(targetRegex, 'John'); print(result); // 输出结果:My name is John and my parameter is called \&param. }
正则逻辑详解
让我们拆解一下这个正则r'(?<!\\)&param'的作用:
(?<!\\):这是负向零宽后行断言,它的作用是检查当前位置的前一个字符不是反斜杠\。它不会消耗任何字符,只是做一个条件判断。&param:就是你要匹配替换的目标子串。
这样一来:
- 对于
&param:前面没有反斜杠,断言成立,会被匹配替换成John。 - 对于
\&param:前面直接有一个反斜杠,断言不成立,不会被替换,完美符合你的需求。
扩展说明(可选)
如果之后你需要支持任意参数名(比如&username、&age这类),可以把正则改成捕获参数名的形式:
final dynamicRegex = RegExp(r'(?<!\\)&(\w+)'); // 替换时可以根据捕获的参数名做不同处理 String dynamicResult = originalStr.replaceAllMapped(dynamicRegex, (match) { String paramName = match.group(1)!; // 这里可以根据参数名返回对应的值,比如模拟一个参数映射 Map<String, String> params = {'param': 'John', 'username': 'Alice'}; return params[paramName] ?? match.group(0)!; });
内容的提问来源于stack exchange,提问作者Harnold
相关产品推荐
相关产品推荐

