#字符串与插值
#字符串基础
Dart 中的字符串表示 UTF-16 代码单元序列。你可以使用单引号或双引号创建字符串。
String single = '单引号';
String double = "双引号";#字符串插值
字符串插值允许你使用 $ 或 ${} 在字符串中嵌入表达式。
#简单插值
var name = 'Alice';
var age = 25;
print('我的名字是 $name'); // 我的名字是 Alice
print('我今年 $age 岁'); // 我今年 25 岁#表达式插值
对表达式使用 ${}:
var price = 10;
var quantity = 3;
print('总计:¥${price * quantity}'); // 总计:¥30
print('明年我将 ${age + 1} 岁'); // 明年我将 26 岁#多行字符串
#三引号
String multiline = '''
这是一个
多行
字符串
''';
String another = """
另一种创建
多行字符串
的方式
""";#字符串连接
String part1 = '你好,';
String part2 = '世界!';
String combined = part1 + part2; // 你好,世界!
// 相邻字符串字面量
String message = '这是一个 '
'跨越多行的 '
'长字符串';#原始字符串
原始字符串将反斜杠视为字面字符:
String path = r'C:\Users\Documents\file.txt';
print(path); // C:\Users\Documents\file.txt
String regex = r'\d+'; // 正则表达式模式#转义序列
String newline = '第 1 行\n第 2 行';
String tab = '列1\t列2';
String quote = '她说:"你好"';
String singleQuote = '今天\'天气不错';
String backslash = '路径:C:\\文件夹\\文件';#常用字符串操作
#长度
String text = '你好';
print(text.length); // 2#大小写转换
String name = 'Alice';
print(name.toUpperCase()); // ALICE
print(name.toLowerCase()); // alice#修剪
String padded = ' 你好 ';
print(padded.trim()); // '你好'
print(padded.trimLeft()); // '你好 '
print(padded.trimRight()); // ' 你好'#检查内容
String text = '你好,世界!';
print(text.contains('世界')); // true
print(text.startsWith('你好')); // true
print(text.endsWith('!')); // true
print(text.isEmpty); // false
print(text.isNotEmpty); // true#子字符串
String text = 'Hello, World!';
print(text.substring(0, 5)); // Hello
print(text.substring(7)); // World!#分割和连接
String csv = '苹果,香蕉,橙子';
List<String> fruits = csv.split(',');
print(fruits); // [苹果, 香蕉, 橙子]
String joined = fruits.join(' - ');
print(joined); // 苹果 - 香蕉 - 橙子#替换
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!#索引操作
String text = 'Hello';
print(text[0]); // H
print(text.indexOf('l')); // 2
print(text.lastIndexOf('l')); // 3#填充
String num = '42';
print(num.padLeft(5, '0')); // 00042
print(num.padRight(5, '0')); // 42000#字符串比较
String str1 = '苹果';
String str2 = '香蕉';
print(str1 == str2); // false
print(str1.compareTo(str2)); // 负数(str1 < str2)#字符串缓冲区
用于在循环中高效连接字符串:
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
String emoji = '😀';
print(emoji.length); // 2(UTF-16 代码单元)
print(emoji.runes.length); // 1(实际字符)
// 遍历字符
for (var rune in emoji.runes) {
print(String.fromCharCode(rune));
}#正则表达式
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
- 对简单字符串优先使用单引号
- 对多行字符串使用三引号
#完整示例
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());
}