Dart中如何转义正则表达式里的星号?
解决Dart中正则表达式星号转义的问题
你遇到的问题根源在于Dart字符串字面量的转义规则和regex101的运行环境不一样。在regex101里,你写的\*\*(.*?)\*\*是直接传给正则引擎的,但在Dart的普通字符串中,反斜杠\本身是转义字符,会被Dart的字符串解析器先处理,导致实际传递给正则引擎的内容变成了**(.*?)**——这就触发了正则引擎的错误:开头的**是重复量词(*表示重复前面的元素0次或多次),但它前面没有可重复的原子,所以抛出FormatException: Nothing to repeat。
要解决这个问题,有两种常用方式:
1. 转义字符串中的反斜杠
在Dart普通字符串里,每个字面的\需要写成\\,这样字符串解析器才会把它转换成一个单独的\传递给正则引擎。你的正则表达式需要修改成:
RegExp regex = RegExp("\\*\\*(.*?)\\*\\*");
2. 使用Dart原始字符串(推荐)
Dart支持原始字符串字面量,用r前缀标记,这种字符串会忽略所有转义规则,里面的\直接作为字面量保留。这样你就可以直接使用和regex101里完全一样的正则写法:
RegExp regex = RegExp(r"\*\*(.*?)\*\*");
完整测试代码
两种写法的效果一致,以下是完整的示例:
void main() { String text = "find me **this** and **my other string** please"; // 方法1:转义反斜杠 RegExp regex1 = RegExp("\\*\\*(.*?)\\*\\*"); print("方法1匹配结果:"); for (var match in regex1.allMatches(text)) { print(match.group(1)); } // 方法2:原始字符串 RegExp regex2 = RegExp(r"\*\*(.*?)\*\*"); print("\n方法2匹配结果:"); for (var match in regex2.allMatches(text)) { print(match.group(1)); } }
运行后会输出:
方法1匹配结果: this my other string 方法2匹配结果: this my other string
内容的提问来源于stack exchange,提问作者atreeon
相关产品推荐
相关产品推荐

