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

一、概述

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

二、主要用途与示例

2.1 避免转义字符干扰

场景说明

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

代码示例

dart 复制代码
// 普通字符串(需双重转义)
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),原始字符串可避免繁琐的双重转义,提升代码可读性。

代码示例

dart 复制代码
// 普通字符串(需双重转义)
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、\"、$)作为普通字符输出,而非触发其特殊含义(如换行、转义引号、字符串插值)。

代码示例

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

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

三、原始多行字符串

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

代码示例

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

四、注意事项

4.1 字符串插值失效

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

示例

dart 复制代码
String name = "Alice";
String rawInterpolate = r"Hello $name";
print(rawInterpolate); // 输出:Hello $name(而非 Hello Alice)

4.2 转义字符完全被忽略

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

示例

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

五、总结

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

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

相关推荐
拥小抱3 小时前
Compose 知识点
android
文章永久免费只为良心3 小时前
Web应用安全与防护_第三章_日志文件包含_从一道 CTFshow 题目讲透「日志投毒型 LFI → RCE」:原理、时序陷阱与全变种攻防手册
android·网络安全·渗透测试·漏洞危害·漏洞描述·日志投毒·红队指南
AIsoft_86894 小时前
学术讲座录音如何整理?录音APP可行吗
android·iphone
Patrick在香港6 小时前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
海雅达手持终端PDA7 小时前
工业手持终端的“去手机化”演进:看海雅达如何以“同轴扫摄”终结工程妥协,重塑工业PDA新范式
android·物联网·智能手机·硬件工程·能源·制造·iot
booboosui8 小时前
删掉一个住在本机的 agent:8 处要清,顺序不能反
android
hcgeng9 小时前
Android获取崩溃日志
android
aqi009 小时前
AI编程让鸿蒙开发电子书APP更加快捷
android·华为·harmonyos·鸿蒙·harmony
GY-939 小时前
【Android】Android Studio 中的协程
android