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

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

相关推荐
Devil枫1 小时前
Kotlin高级特性深度解析
android·开发语言·kotlin
ChinaDragonDreamer1 小时前
Kotlin:2.1.20 的新特性
android·开发语言·kotlin
雨白12 小时前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
kk爱闹13 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空15 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭16 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日16 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安17 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑17 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟21 小时前
CTF Web的数组巧用
android