You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:32