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

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

相关推荐
LiuYaoheng6 小时前
【Android】View 的基础知识
android·java·笔记·学习
出海小纸条6 小时前
Google Play 应用被拒-数据安全表单无效(设备上的应用)
android
和煦的春风6 小时前
简单讨论下lmkd 查杀机制
android
Android轮子哥6 小时前
月下载 40 万次的框架是怎么练成的
android
三少爷的鞋6 小时前
Kotlin 协程真的是线程框架吗?
android
三雒7 小时前
ART堆内存系列二:从堆中排除大对象
android·性能优化
Android-Flutter7 小时前
kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
android·kotlin
zfxwasaboy7 小时前
linux Kbuild详解关于fixdep、Q、quiet、escsq
android·linux·ubuntu
Mr YiRan8 小时前
Android模拟简单的网络请求框架Retrofit实现
android·retrofit
zh_xuan13 小时前
Android Looper源码阅读
android