Skip to content

字符串与插值

字符串基础

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 数字 4

Unicode 和 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);  // 我的邮箱是 [邮箱]

最佳实践

  1. 使用字符串插值而不是连接
  2. 对路径和正则表达式模式使用原始字符串
  3. 在循环中构建字符串时使用 StringBuffer
  4. 对简单字符串优先使用单引号
  5. 对多行字符串使用三引号

完整示例

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());
}

下一步