Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Sử dụng regex để replace hiệu quả hơn
Tình cờ có 1 task động tới thay thế bằng regex, thấy hay ho xịn xò nên em note lại vài dòng. Hi vọng sẽ có ích cho các bác
TL;DR
Sử dụng regex để capture lại giá trị tìm kiếm được trong các group và sử dụng lại giá trị capture này trong việc thay thế.
VD:
Regex tìm kiếm:
(\d+)Z
=> Tìm kiếm các giá trị là số, theo sau bởi chữ Z. Lưu giá trị số vào trong group 1 (cặp ngoặc tròn thứ 1 là group 1, thứ 2 là group 2,...)
Regex thay thế sử dụng lại giá trị capture được trong group regex (\d+)
$1.000Z
$1, $2,... $n
là các giá trị capture được trong các group.
Ví dụ cụ thể
Tớ có chuỗi date time như sau:
"2018-08-05T03:39:11Z"
"2018-08-05T03:38:25Z"
"2018-08-05T03:37:13Z"
"2018-08-05T03:36:44Z"
Tớ muốn chuyển các chuỗi trên thành
ISODate("2018-08-05T03:39:11.000Z")
ISODate("2018-08-05T03:38:25.000Z")
ISODate("2018-08-05T03:37:13.000Z")
ISODate("2018-08-05T03:36:44.000Z")
Tức là
- Thêm ISODate(" vào đầu mỗi chuỗi
- Sau kí tự giây, thêm .000 vào và đóng ngoặc )
Thực hiện
Yêu cầu đầu tiên khá dễ dàng. Chỉ cần replace thông thường:
replace("\"2018", "ISODate(\"2018")
Ta sẽ thu được
ISODate("2018-08-05T03:39:11Z"
ISODate("2018-08-05T03:38:25Z"
ISODate("2018-08-05T03:37:13Z"
ISODate("2018-08-05T03:36:44Z"
Với yêu cầu tiếp theo, ta cần
- Lấy ra giá trị giây hiện tại (1), kí tự Z và kí tự " (VD: 11Z", 25Z", 13Z", 44Z")
- Thay thế cụm trên bằng (1) .000 Z ") (VD:
11Z" => 11.000Z")
)
Vì các giá trị giây là khác nhau, nên ta không thể thay thế chính xác như yêu cầu đầu tiên được. Ta cần capture lại giá trị số của giây, thay thế cụm giâyZ" thành giây.000Z"). Sử dụng regex
replace("(\d+)Z\"", "$1.000Z\"_")
Kết quả thu được
ISODate("2018-08-05T03:39:11.000Z")
ISODate("2018-08-05T03:38:25.000Z")
ISODate("2018-08-05T03:37:13.000Z")
ISODate("2018-08-05T03:36:44.000Z")
Nguồn bài viết từ blog của mình: https://minhphong306.wordpress.com/2018/10/05/trick-su-dung-regex-capture-lai-gia-tri-de-replace/
minhphong306 06-10-2018






