Substring

Quá trình trích xuất một phần của chuỗi. Thực hiện bằng các phương thức như slice, substring hoặc substr.

Chuỗi con là chuỗi thu được bằng cách trích xuất một phần của chuỗi gốc. Đây là thao tác cơ bản thường được sử dụng trong xử lý văn bản và phân tích dữ liệu, được áp dụng trong vô số tình huống thực tế như trích xuất tên tệp từ đường dẫn, tên miền từ URL và dấu thời gian từ thông báo log.

JavaScript cung cấp ba phương thức để trích xuất chuỗi con: slice(), substring(), and substr(). slice(start, end) hỗ trợ chỉ số âm để định vị từ cuối, khiến nó linh hoạt nhất. substring(start, end) coi đối số âm là 0 và tự động hoán đổi đối số nếu start vượt quá end. substr(start, length) nhận độ dài làm đối số thứ hai nhưng đã bị loại bỏ trong đặc tả ECMAScript. Trong thực tế, slice() là lựa chọn an toàn nhất. Sách phương thức chuỗi JavaScript giải thích sự khác biệt giữa các phương pháp này.

Python sử dụng ký pháp slice str[start:end] như phương pháp tiêu chuẩn. str[2:5] trích xuất ba ký tự từ chỉ số 2 đến 4, và str[-3:] lấy ba ký tự cuối. Chỉ định bước (str[::2]) cho phép trích xuất mỗi ký tự thứ hai. Java sử dụng phương thức substring(beginIndex, endIndex) , trong khi Go sử dụng cú pháp slice str[start:end] .

Khi trích xuất chuỗi con từ văn bản Unicode, cần chú ý đến ranh giới cặp thay thế và cụm grapheme. Của JavaScript, slice() hoạt động trên đơn vị mã UTF-16, nên cắt giữa emoji hoặc ký tự cặp thay thế tạo ra chuỗi không hợp lệ. Để trích xuất chính xác theo ký tự, sử dụng [...str].slice(start, end).join('') để phân tách thành code point trước.

Một quan niệm sai lầm phổ biến là trích xuất chuỗi con luôn tạo chuỗi mới. Trong các phiên bản Java cũ (trước Java 7 update 6), substring() chia sẻ mảng nội bộ của chuỗi gốc, gây rò rỉ bộ nhớ khi giữ lại chuỗi con ngắn ngăn cản thu gom rác của toàn bộ chuỗi gốc. Java hiện đại sao chép sang mảng mới, giải quyết vấn đề này.

Từ góc độ đếm ký tự, độ dài chuỗi con có thể được tính là end - start, nhưng với ký tự đa byte, số byte và số ký tự khác nhau. Ví dụ, trích xuất 2 ký tự đầu tiên của chuỗi tiếng Nhật trong UTF-8 cho ra 2 ký tự nhưng 6 byte (3 byte mỗi ký tự). Khi lưu trữ chuỗi con trong trường biểu mẫu hoặc cột cơ sở dữ liệu giới hạn ký tự, việc xác minh cả số ký tự và số byte là thiết yếu. Sách lập trình xử lý văn bản so sánh thao tác chuỗi con giữa các ngôn ngữ.