一、概述
在 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 或 + 拼接多行 |
典型应用场景 | 正则表达式、文件路径、保留特殊字符 | 普通文本输出、动态内容拼接 |
通过合理使用原始字符串,可简化包含复杂转义逻辑的代码,提高开发效率和代码可读性。