Dart 原始字符串(Raw Strings)详解文档

7 阅读2分钟

一、概述

在 Dart 编程语言中,r 前缀用于创建原始字符串(raw strings)。原始字符串的核心特性是忽略所有转义字符,其中的每个字符都会按字面意义解析,适用于需要保留特殊字符原始形态的场景。

二、主要用途与示例

2.1 避免转义字符干扰

场景说明

当字符串中包含大量反斜杠(如文件路径、URL 地址)时,普通字符串需要使用双重转义(\\),而原始字符串可直接保留单个反斜杠。

代码示例

// 普通字符串(需双重转义)
String normalPath = "C:\\Users\\Documents\\file.txt";
print(normalPath); // 输出:C:\Users\Documents\file.txt

// 原始字符串(无需转义)
String rawPath = r"C:\Users\Documents\file.txt";
print(rawPath); // 输出:C:\Users\Documents\file.txt

2.2 简化正则表达式书写

场景说明

正则表达式中常包含大量反斜杠(如 \d\s),原始字符串可避免繁琐的双重转义,提升代码可读性。

代码示例

// 普通字符串(需双重转义)
RegExp normalRegex = RegExp('\\d{3}-\\d{2}-\\d{4}'); // 匹配格式:XXX-XX-XXXX

// 原始字符串(直接书写反斜杠)
RegExp rawRegex = RegExp(r'\d{3}-\d{2}-\d{4}'); // 等价于上方正则表达式

2.3 保留特殊字符原始形态

场景说明

需要将特殊字符(如 \n\"$)作为普通字符输出,而非触发其特殊含义(如换行、转义引号、字符串插值)。

代码示例

// 普通字符串:\n 会被解析为换行符
String normalString = "Hello\nWorld";
print(normalString); 
// 输出:
// Hello
// World

// 原始字符串:\n 会被视为普通字符
String rawString = r"Hello\nWorld";
print(rawString); // 输出:Hello\nWorld

三、原始多行字符串

使用三个单引号(''')或双引号(""")可创建原始多行字符串,其中的换行符、缩进会被保留,且同样忽略转义字符。

代码示例

// 原始多行字符串(单引号)
String multiLineRawString = r'''
    第一行文本
    第二行文本(包含 $ 符号:$name)
    第三行文本 \n 会被视为普通字符
''';
print(multiLineRawString); 
// 输出:
//     第一行文本
//     第二行文本(包含 $ 符号:$name)
//     第三行文本 \n 会被视为普通字符

四、注意事项

4.1 字符串插值失效

原始字符串中的 $ 符号不会触发字符串插值功能,即使其后跟随变量名,也会被视为普通字符。

示例

String name = "Alice";
String rawInterpolate = r"Hello $name";
print(rawInterpolate); // 输出:Hello $name(而非 Hello Alice)

4.2 转义字符完全被忽略

原始字符串中,任何以 \ 开头的转义序列(如 \t\u{1F600})都会被直接输出,不会被解析为制表符、Unicode 字符等。

示例

String rawEmoji = r"\u{1F600} 笑脸表情";
print(rawEmoji); // 输出:\u{1F600} 笑脸表情(不会显示笑脸图标)

五、总结

特性原始字符串(r 前缀)普通字符串
转义字符处理忽略,按字面输出解析为特殊含义(如 \n 换行)
字符串插值不生效($ 视为普通字符)生效($变量名 替换为值)
多行字符串支持使用 '''""" 包裹,保留换行需要 \n+ 拼接多行
典型应用场景正则表达式、文件路径、保留特殊字符普通文本输出、动态内容拼接

通过合理使用原始字符串,可简化包含复杂转义逻辑的代码,提高开发效率和代码可读性。