Flutter String 常用方法

image

Dart / Flutter字符串方法和运算符教程(含示例)
DartString是UTF-16(16位Unicode转换格式)代码单元的序列。它使Dart更加强大,可以用任何语言构建我们的移动和Web应用程序。在本教程中,我们将介绍许多有用的Dart字符串方法和运算符。你会知道:

  • 在Dart / Flutter中创建某种字符串的方法
  • 方法从Dart / Flutter中的字符串获取数据
  • 在Dart / Flutter中验证字符串中的数据的基本方法
  • 如何在Dart / Flutter中转换,分割,合并和修剪字符串
  • 在Dart / Flutter中替换字符串中的子字符串的某种方法

创建普通的字符串

要创建一个字符串,我们可以使用单引号或双引号:

String s1 = 'bezkoder.com - Mobile code examples';
String s2 = "bezkoder.com - Mobile App Development tutorials";

String s3 = 'It\'s not easy to become a developer, but worthy!';
String s4 = "It's not easy to become a developer, but worthy!";
// It's not easy to become a developer, but worthy!

创建原始字符串

对于原始字符串,我们将r在字符串的引号之前使用:

String raws1 = r'bezkoder.com\nMobile App Development tutorials';
print(raws1);
// bezkoder.com\nMobile App Development tutorials

String raws2 = r"It\'s not easy to become a developer, but worthy!";
print(raws2);
// It\'s not easy to become a developer, but worthy!

创建多行字符串
我们将使用三引号创建多行字符串:

String s1 = '''bezkoder.com
Mobile Code examples''';
print(s1);
/*
bezkoder.com
Mobile Code examples
*/

String s2 = """bezkoder.com
App Development tutorials""";
print(s2);
/*
bezkoder.com
App Development tutorials
*/

使用UTF-32单位创建字符串

我们知道Dart字符串是UTF-16代码单元的序列。因此,要使用UTF-32单位创建字符串,我们需要使用特定的语法:

  • \uXXXX表示4位十六进制值

  • 表示(\u{XX}或\u{XXXXX}大括号中的十六进制值)少于或超过4位数字。

String u1 = 'Unicode emoticon characters: \u{1f603} \u{1f604} \u{1f605} \u{1f606} \u{1f607}';
print(u1);
// Unicode 5-digit: ? ? ? ? ?

String u2 = 'Miscellaneous symbols: \u{266A} \u{266B} \u{266C} \u{266D} \u{266E} \u{266F}';
print(u2);
// Miscellaneous symbols: ♪ ♫ ♬ ♭ ♮ ♯

String u3 = 'Greek characters: \u{3B1} \u{3B2} \u{3B3} \u{3B4} \u{3B5}';
print(u3);
// Greek characters: α β γ δ ε

Dart / Flutter通过索引获取字符

  • 通过索引获取一个字符
  • 现在,我们将Dart字符串视为一个列表,其中每个字符都作为一个项目:
String str = 'bezkoder.com - Mobile code examples';
str[0]; // b
str[2]; // z

在上面的代码中,我们使用Dart String运算符[]。

在Dart / Flutter中获取子字符串

  • 要从Dart字符串获取子字符串,我们使用substring()方法:
String str = 'bezkoder.com';
str.substring(0,8); // bezkoder
str.substring(2,8); // zkoder
str.substring(3);   // koder.com

这是substring()返回a 的方法的签名String

String substring(int startIndex, [int endIndex]);
  • startIndex:开始的字符索引。起始索引为0。

  • endIndex(可选):结束字符+的索引1。如果未设置,则结果将是从startIndex字符串开始到结尾的子字符串。

例如,我们希望'r'是结尾。在“ bezkoder.com”中,“ r”的索引为7。因此,我们需要设置endIndex的8。

Dart / Flutter获取字符串中字符/子字符串的位置

For the first

我们可以使用以下indexOf()方法来做到这一点:

String s = 'bezkoder.com';
s.indexOf('e');           // 1
s.indexOf('er');          // 6
s.indexOf(RegExp(r'e.')); // 1
s.indexOf('code');        // -1

indexOf()-1如果没有匹配项,将返回。

For the last

我们可以使用以下lastIndexOf()方法来做到这一点:

String s = 'bezkoder.com';
s.lastIndexOf('e');           // 6
s.lastIndexOf(RegExp(r'e.')); // 6
s.lastIndexOf('code');        // -1

lastIndexOf()-1如果没有匹配项,将返回。

Dart / Flutter转换String方法

toUpperCase()并且toLowerCase()方法返回一个新字符串(不更改原始字符串),并且所有字母均已转换为大写或小写格式:

String str = 'bezkoder';
String upperStr = str.toUpperCase();
print(upperStr); // BEZKODER
print(str);      // bezkoder

String lowerStr = upperStr.toLowerCase();
print(lowerStr); // bezkoder
print(upperStr); // BEZKODER

Dart / Flutter首字母大写

我们可以使用intltoBeginningOfSentenceCase()方法将字符串的首字母转换为大写字母,将其他字母转换为小写:

import 'package:intl/intl.dart';

main() {
  String sentence = toBeginningOfSentenceCase('bezkoder');
  print(sentence); // Bezkoder
}

Dart / Flutter 验证字符串

  • 检查空字符串
  • 我们使用Dart字符串属性isEmpty或isNotEmpty了解字符串是否为空:
String emp = '';
emp.isEmpty;    // true
emp.isNotEmpty; // false

检查字符串是否包含子字符串
我们使用contains()带有签名的方法,如下所示:

bool contains(Pattern substring, [int startIndex = 0]);
  • substring可以是一个String或一个RegExp对象。
  • startIndex(可选):方法所匹配的索引substring
String s = 'bezkoder';
s.contains('k');                 // true
s.contains(RegExp(r'[a-c]'));    // true

s.contains('z', 3);              // false
s.contains(RegExp(r'[a-c]'), 1); // false
s.contains(RegExp(r'[a-d]'), 1); // true

检查字符串是否以字符/字符串开头/结尾

我们可以使用endsWith()方法来做到这一点:

String s = 'bezkoder';

s.startsWith('b');   // true
s.startsWith('z');   // false
s.startsWith('bez'); // true

s.endsWith('r');     // true
s.endsWith('z');     // false
s.endsWith('koder'); // true

Dart / Flutter连接和拆分字符串方法

  • 连接/连接字符串
  • 我们有3种方式连接两个Dart字符串:

使用插值

一条语句中的单独字符串使用Dart字符串运算符

String a = 'bezkoder';
String b = '.com';

String s1 = '$a$b';    // interpolation
String s2 = '$a' '$b'; // separated in one statement
String s3 = a + b;     // operator
/* bezkoder.com */
  • 将字符串与其自身连接使用Dart字符串运算符*,我们可以将字符串乘以多次:
String s = '=bezkoder';
print(s*3);
// =bezkoder=bezkoder=bezkoder
  • 分割字符串该split()方法在模式匹配项处拆分字符串,并在匹配项之间返回一个子字符串列表:
List split(Pattern pattern);
  • 该pattern输入参数可以是一个String或一个RegExp对象。例如:
String s1 = 'bezkoder.earth.com';
s1.split('.');
// [bezkoder, earth, com]

String s2 = 'bezkoder2019.com';
s2.split(RegExp(r'[0-9]+'));
// [bezkoder, .com]

String s3 = 'bezkoder';
s3.split('');
// [b, e, z, k, o, d, e, r]

分割字符串,转换,然后连接字符串

  • Dart提供了splitMapJoin()一种方法,它可以在一条语句中完成3件事:
String splitMapJoin(
    Pattern pattern,
    {String onMatch(Match match), String onNonMatch(String nonMatch)}
);
  • pattern可以是一个String或一个RegExp对象。
  • onMatch(可选):将每个匹配项转换为字符串。
  • onNonMatch(可选):将每个不匹配的部分转换为字符串。
String result = 'bezkoder2019.com'.splitMapJoin(
  RegExp(r'[0-9]+'),
  onMatch: (m) => '_${m.group(0)}_',
  onNonMatch: (n) => '[${n}]');

print(result);
// [bezkoder]_2019_[.com]

result = 'bezkoder2019.com'.splitMapJoin(
  RegExp(r'[0-9]+'),
  onNonMatch: (n) => '[${n}]');

print(result);
// [bezkoder]2019[.com]

result = 'bezkoder2019.com'.splitMapJoin(
  RegExp(r'[0-9]+'),
  onMatch: (m) => '_${m.group(0)}_');

print(result);
// bezkoder_2019_.com

Flutter/Dart对齐文本

  • padLeft()方法返回具有给定的minimum的右对齐String width。如果width小于或等于String的长度,则不添加填充。
  • padRight()方法返回具有给定的minimum的左对齐String width。如果width小于或等于String的长度,则不添加填充。
String s = 'bezkoder';

s.padLeft(10);       // '  bezkoder'
s.padLeft(10, '=');  // '==bezkoder'

s.padRight(10);      // 'bezkoder  '
s.padRight(10, '='); // 'bezkoder=='

Flutter/Dart装饰

  • trimLeft()从左侧返回不带空格字符的新String。
  • trimRight()是从右边开始的。
  • trim()返回开头或结尾没有任何空格字符的新String。
String s = '\tbezkoder.com ';
s.trimLeft();  // 'bezkoder.com '
s.trimRight(); // '\tbezkoder.com'
s.trim();      // 'bezkoder.com'

Flutter/Dart String替换方法

For the first

String replaceFirst(Pattern from, String to, [int startIndex = 0]);
String replaceFirstMapped(Pattern from, String replace(Match match),[int startIndex = 0]);
  • replaceFirst()方法返回一个新字符串替换的第一场比赛from有to来自启动startIndex。
  • replaceFirstMapped()返回一个新的字符串,其中的第一个匹配项from被replace(match)函数的结果替换。Dart / Flutter字符串
String s = 'bezkoder.com';
s.replaceFirst('e', 'E');    // bEzkoder.com
s.replaceFirst('e', 'E', 3); // bezkodEr.com
s.replaceFirst(RegExp(r'koder'), 'programmer'); // bezprogrammer.com

s.replaceFirstMapped('e', (m) => '[${m.group(0)}]');    // b[e]zkoder.com
s.replaceFirstMapped('e', (m) => '[${m.group(0)}]', 3); // bezkod[e]r.com 

For the last

  • replaceAll()方法返回一个新的字符串,该字符串将所有匹配项替换为另一个字符串。
  • replaceAllMapped()方法返回一个新的String,其中所有匹配项均被replace(match)函数的结果替换。
String s = 'bezkoder.com';
s.replaceAll('e', '[e]');
// b[e]zkod[e]r.com

s.replaceAllMapped(RegExp(r'e.'),
    (m) => m.group(0).contains('z') ? m.group(0) : '[' + m.group(0) + ']');
// bezkod[er].com

您可以看到该replaceAllMapped()方法在我们想根据匹配返回新内容的情况下很有用。

在范围内

如果我们想用另一个String替换一个String的范围而不关心它是什么,我们可以使用replaceRange()method

String replaceRange(int start, int end, String replacement);
该方法将取代从子start指标end与指标replacement。

String s = 'bezkoder.com';
s.replaceRange(2, 4, 'zzzzzzzzz');
// bezzzzzzzzzoder.com

结论

我们已经学习了Dart String的许多知识,从创建,获取,验证到转换,分割,联接,修剪String,替换子字符串……,希望您对如何使用Dart String方法和运算符有一个很好的认识。

flutter实战指南 flutter大神出的书 很多实战分享 籍值得购买~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356