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+ 拼接多行
典型应用场景 正则表达式、文件路径、保留特殊字符 普通文本输出、动态内容拼接

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

相关推荐
鸟儿不吃草5 小时前
安卓实现左右布局聊天界面
android·开发语言·python
xxjj998a6 小时前
Laravel 1.x:PHP框架的原始魅力
android·php·laravel
formula100006 小时前
在iOS/安卓上远程连接任何 Agent!Claude、Codex、Copilot、Gemini、OpenCode 等
android·copilot
该用户可能存在6 小时前
Blbl-android 更新至 v0.1.24,体验更流畅、更稳定
android·哔哩哔哩·电视app·androidtv·bbll·blbl·bilibilitv
lKWO OMET7 小时前
mysql之字符串函数
android·数据库·mysql
liang_jy17 小时前
Android SparseArray
android·源码
liang_jy18 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
NPE~19 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心19 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android
AtOR CUES20 小时前
MySQL——表操作及查询
android·mysql·adb