Kiểu xâu String trong Dart/Flutter
Kiểu xâu String trong Dart là một trong những kiểu dữ liệu cơ bản (built in type) cùng với kiểu số (số nguyên int, số thực double) và các kiểu tập hợp set, kiểu danh sách List…
1. Kiểu xâu String là gì?
Kiểu String trong Dart sử dụng để biểu diễn chuỗi ký tự Unicode(UTF-16) (bạn có thể sử dụng các xâu có kí tự tiếng Việt hoặc bất cứ thứ tiếng nào mà sử dụng được với mã Unicode.
Để khai báo/sử dụng một xâu (từ giờ chúng tôi sẽ gọi trực tiếp là String)
chúng ta sử dụng cách khai báo như trong bài Biến và các kiểu dữ liệu trong Dart, và đặt String
đó trong cặp dấu nháy đơn '
hoặc cặp dấu nháy kép "
Ví dụ 'Phan Văn Phương'
hoặc "là người đẹp trai nhất thế giới"
Theo gợi ý của Visual Studio Code, thì chúng ta nên sử dụng cặp dấu nháy đơn
'
để bao nội dung của mộtString
.
Nếu của String
của bạn gồm nhiều dòng, có thể đặt chúng trong cặp nháy tam '''
(gồm 3 dấu nháy đơn '
) hoặc """
(gồm 3 dấu nháy kép "
), ví dụ:
xau1 = '''đây là một String nằm trên nhiều dòng'''; xau2 = """mùa xuân sang có hoa anh đào blah blah... tôi là một con gà""";
2. Truy cập đến từng kí tự của String
Các kí tự của một String
đều được đánh chỉ số từ 0
cho đến n-1
, với n
là độ dài của String
và được truy cập qua thuộc tính length
void main() { String viDu = 'abcdef'; print(viDu.length); //kết quả 6 print(viDu[2]); //kết quả 'c' }
Kiểu String
là một kiểu dữ liệu immutable
, tức là kiểu dữ liệu không thể thay đổi. Do đó, các phép gán làm thay đổi nội dung của String
đều không hợp lệ. Chẳng hạn với xâu viDu
ở trên, nếu bạn cố tình gán viDu[2] = '3'
thì Dart sẽ rủa cho bạn một trận 🙂
Tuy nhiên, bạn có thể sử dụng nhiều phương thức (method
) trên một String
như nối, tách, cắt khoảng trống… của một String
, vì khi đó thực ra String
ban đầu không thay đổi mà kết quả của các phương thức này được gán vào một String
mới!
void main() { String viDu = ' ab cdef '; viDu.trim(); print(viDu);//kết quả vẫn là ' ab cdef ' print(viDu.trim());//kết quả là 'ab cdef' }
3. Các kí tự đặc biệt của một String
- Để viết một kí tự nháy đơn
'
bạn có thể bao trong một String sử dụng cặp ngoặc nháy kép"
và ngược lại, ví dụ
void main() { print("đây là dấu nháy đơn ' này"); print('còn đây là dấu nháy kép "'); }
- Hoặc sử dụng kí tự thoát
\
(string escape) cùng với các dấu nháy đó, cách này có thể sử dụng cho cả các kí tự khác như\ $
void main() { print('in các kí tự ~!@#%^&*() dễ oẹt');//in các kí tự ~!@#%^&*() dễ oẹt print('các kí tự đặc biệt: \' $ \\');//các kí tự đặc biệt: ' $ \ print('còn đây là kí tự xuống \n dòng'); }
- Kí tự xuống dòng
\n
- Kí tự tab
\t
- Kí tự xóa kí tự liền trước
\b
- Kí tự trở về đầu của xâu
\r
void main() { print('nu na nu nống\n cái cống nằm trong\ncon ong nằm ngoài\b\b\b\rủ khoai chấm\tmật'); }
Khi chạy chương trình, chúng ta thu được kết quả như sau:
4. Các thuộc tính và phương thức của kiểu xâu String trong Dart
Lưu ý rằng kiểu xâu String trong Dart là immutable
, nên các phương thức sau đều trả về một xâu mới, còn xâu ban đầu thì không hề thay đổi.
4.0. Các thuộc tính của kiểu xâu String trong Dart
length
cho độ dài của xâuisEmpty
kiểm tra xem một String có là xâu rỗng hay khôngisNotEmpty
kiểm tra xem một String có khác xâu rỗng hay không
4.1. Xâu con trong Dart
Sử dụng phương thức subString(i,j)
để lấy ra một xâu con từ chỉ số i
tới chỉ số j-1
của xâu đã cho.
void main() { String xauMe = 'abcdefgh'; String xauCon = xauMe.substring(2,5); print(xauCon);//kết quả 'cde' }
indexOf(Pattern pattern,[int start = 0])
trả về số nguyên là vị tríindex
xuất hiện đầu tiên củapattern
ở trong xâu, bắt đầu tìm từ vị trístart
(mặc định là0
, tức tìm từ đầu xâu), nếu không tìm thấy thì trả về-1
void main(){ var string = 'Dartisans'; string.indexOf('art'); //kết quả 1 string.indexOf(RegExp(r'[A-Z][a-z]')); //kết quả 0 string.indexOf(RegExp(r'dart')); //kết quả -1 }
lastIndexOf(Pattern pattern,[int? start])
tương tự như trên nhưng là vị trí xuất hiện cuối cùng củapattern
void main(){ var string = 'Dartisans'; string.lastIndexOf('a'); //kết quả 6 string.lastIndexOf(RegExp(r'a(r|n)')); //kết quả 6 string.lastIndexOf(RegExp(r'DART')); //kết quả -1 }
4.2. Các phương thức kiểm tra xâu con
startsWith(String other)
kiểm tra xem xâu có bắt đầu bằng xâuother
hay không.endsWith(String other)
kiểm tra xem xâu có kết thúc bằng xâuother
hay không.contains(Pattern other,[int startIndex = 0])
dùng để kiểm tra một xâu có chứaother
hay không, bắt đầu từ kí tựindex
, mặc định bằng0
. Kết quả trả về làtrue
nếu tìm thấy vàfalse
nếu không tìm thấy. Ở đâyother
có thể là một xâu, một kí tự hoặc một biểu thức chính quyregex
4.3. Chuyển đổi sang chữ hoa, chữ thường
toLowerCase()
trả về một xâu mới dạng chữ thường của xâu ban đầutoUpperCase()
trả về một xâu mới dạng chữ HOA của xâu ban đầu
4.4. Cắt khoảng trắng
trim()
dùng để cắt các khoảng trắng (cấu cách, dấu tab, kí tự xuống dòng) ở 2 đầu của xâutrimLef()
vàtrimRight()
dùng để cắt các khoảng trắng (cấu cách, dấu tab, kí tự xuống dòng) ở đầu bên trái, đầu bên phải của xâu
void main() { String str1 = ' \n \t Mua Xuan sang co hoa anh dao\n '; print('|' + str1.trim() + '|'); print('|' + str1.trimRight() + '|'); print('|' + str1.trimLeft() + '|'); print('|' + str1 + '|'); }
4.5. Nối hai xâu trong Dart
Bạn có thể sử dụng toán tử +
để nối hai xâu String trong Dart.
void main() { String str1 = 'Xuân Hạ Thu Đông'; String str2 = '... Rồi Lại Xuân'; print(str1 + str2);//kết quả 'Xuân Hạ Thu Đông... Rồi Lại Xuân' }
4.6. Tách một xâu trong Dart
Sử dụng phương thức split(kí_tự_tách)
để tách một String
thành các xâu con, ngăn cách nhau bởi kí_tự_tách
void main() { var text = "mùa xuân sang có hoa anh đào"; var parts = text.split(' '); print(parts); print(text); }
4.7. Thay thế xâu con
Sử dụng phương thức replaceAll(s, t)
để thay thế tất cả các xâu con s
bởi xâu t
trong xâu ban đầu. Đương nhiên, kết quả trả về là một xâu mới.
void main() { String str1 = 'Mua Xuan sang co hoa anh dao'; print(str1.replaceAll('Xuan', 'Dong'));//kết quả 'Mua Dong sang co hoa anh dao' print(str1); //vẫn là 'Mua Xuan sang co hoa anh dao' }
4.8. Chuyển số sang xâu
Bạn sử dụng hàm toString()
đối với các đối tượng kiểu số (xem chi tiết trong bài Kiểu số trong Dart/Flutter)
5. Duyệt qua các kí tự của String
Phương thức runes
trả về một Iterable
gồm các mã Unicode của từng kí tự trong xâu. Kết hợp phương thức runes
với vòng lặp for
, chúng ta có thể duyệt qua từng kí tự của xâu.
void main() { var word = 'abcdefgh'; print(word.runes); //kết quả (97, 98, 99, 100, 101, 102, 103, 104) for (var c in word.runes) { print(String.fromCharCode(c)); } for (var c in word.runes) { print(c); } }
6. Nội suy chuỗi (String Interpolation)
Sử dụng kí tự $
để nội suy nội dung của một xâu.
void main() { int a = 5; int b = 7; String ketQua = "Tổng của $a và $b là ${a + b}"; print(ketQua); //Tổng của 5 và 7 là 12 }