字符串与插值
字符串基础
Dart 中的字符串表示 UTF-16 代码单元序列。你可以使用单引号或双引号创建字符串。
dart
String single = '单引号';
String double = "双引号";字符串插值
字符串插值允许你使用 $ 或 ${} 在字符串中嵌入表达式。
简单插值
dart
var name = 'Alice';
var age = 25;
print('我的名字是 $name'); // 我的名字是 Alice
print('我今年 $age 岁'); // 我今年 25 岁表达式插值
对表达式使用 ${}:
dart
var price = 10;
var quantity = 3;
print('总计:¥${price * quantity}'); // 总计:¥30
print('明年我将 ${age + 1} 岁'); // 明年我将 26 岁多行字符串
三引号
dart
String multiline = '''
这是一个
多行
字符串
''';
String another = """
另一种创建
多行字符串
的方式
""";字符串连接
dart
String part1 = '你好,';
String part2 = '世界!';
String combined = part1 + part2; // 你好,世界!
// 相邻字符串字面量
String message = '这是一个 '
'跨越多行的 '
'长字符串';原始字符串
原始字符串将反斜杠视为字面字符:
dart
String path = r'C:\Users\Documents\file.txt';
print(path); // C:\Users\Documents\file.txt
String regex = r'\d+'; // 正则表达式模式转义序列
dart
String newline = '第 1 行\n第 2 行';
String tab = '列1\t列2';
String quote = '她说:"你好"';
String singleQuote = '今天\'天气不错';
String backslash = '路径:C:\\文件夹\\文件';常用字符串操作
长度
dart
String text = '你好';
print(text.length); // 2大小写转换
dart
String name = 'Alice';
print(name.toUpperCase()); // ALICE
print(name.toLowerCase()); // alice修剪
dart
String padded = ' 你好 ';
print(padded.trim()); // '你好'
print(padded.trimLeft()); // '你好 '
print(padded.trimRight()); // ' 你好'检查内容
dart
String text = '你好,世界!';
print(text.contains('世界')); // true
print(text.startsWith('你好')); // true
print(text.endsWith('!')); // true
print(text.isEmpty); // false
print(text.isNotEmpty); // true子字符串
dart
String text = 'Hello, World!';
print(text.substring(0, 5)); // Hello
print(text.substring(7)); // World!分割和连接
dart
String csv = '苹果,香蕉,橙子';
List<String> fruits = csv.split(',');
print(fruits); // [苹果, 香蕉, 橙子]
String joined = fruits.join(' - ');
print(joined); // 苹果 - 香蕉 - 橙子替换
dart
String text = 'Hello, World!';
print(text.replaceAll('o', '0')); // Hell0, W0rld!
print(text.replaceFirst('o', '0')); // Hell0, World!
print(text.replaceRange(7, 12, 'Dart')); // Hello, Dart!索引操作
dart
String text = 'Hello';
print(text[0]); // H
print(text.indexOf('l')); // 2
print(text.lastIndexOf('l')); // 3填充
dart
String num = '42';
print(num.padLeft(5, '0')); // 00042
print(num.padRight(5, '0')); // 42000字符串比较
dart
String str1 = '苹果';
String str2 = '香蕉';
print(str1 == str2); // false
print(str1.compareTo(str2)); // 负数(str1 < str2)字符串缓冲区
用于在循环中高效连接字符串:
dart
StringBuffer buffer = StringBuffer();
for (int i = 0; i < 5; i++) {
buffer.write('数字 $i ');
}
String result = buffer.toString();
print(result); // 数字 0 数字 1 数字 2 数字 3 数字 4Unicode 和 Runes
dart
String emoji = '😀';
print(emoji.length); // 2(UTF-16 代码单元)
print(emoji.runes.length); // 1(实际字符)
// 遍历字符
for (var rune in emoji.runes) {
print(String.fromCharCode(rune));
}正则表达式
dart
String text = '我的邮箱是 alice@example.com';
RegExp emailRegex = RegExp(r'\b[\w\.-]+@[\w\.-]+\.\w+\b');
if (emailRegex.hasMatch(text)) {
String? email = emailRegex.stringMatch(text);
print('找到邮箱:$email'); // 找到邮箱:alice@example.com
}
// 使用正则表达式替换
String censored = text.replaceAll(emailRegex, '[邮箱]');
print(censored); // 我的邮箱是 [邮箱]最佳实践
- 使用字符串插值而不是连接
- 对路径和正则表达式模式使用原始字符串
- 在循环中构建字符串时使用 StringBuffer
- 对简单字符串优先使用单引号
- 对多行字符串使用三引号
完整示例
dart
void main() {
// 基本字符串
String firstName = 'Alice';
String lastName = 'Johnson';
// 插值
String fullName = '$firstName $lastName';
print('全名:$fullName');
// 多行
String address = '''
主街 123 号
纽约,NY 10001
美国
''';
print('地址:$address');
// 操作
String email = 'ALICE@EXAMPLE.COM';
print('小写:${email.toLowerCase()}');
print('包含 @:${email.contains('@')}');
// 分割
List<String> parts = email.split('@');
print('用户名:${parts[0]}');
print('域名:${parts[1]}');
// 构建字符串
StringBuffer message = StringBuffer();
message.write('你好,');
message.write(firstName);
message.write('!');
message.write('欢迎来到 Dart。');
print(message.toString());
}