Chuyển đến nội dung chính

Hướng dẫn Regex trong R

Tìm hiểu biểu thức chính quy trong R, lý do chúng quan trọng, các công cụ và hàm để làm việc với chúng, các mẫu regex phổ biến và cách sử dụng.
Đã cập nhật 5 thg 10, 2026  · 12 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Khái niệm biểu thức chính quy, thường gọi là regex, xuất hiện trong nhiều ngôn ngữ lập trình như R, Python, C, C++, Perl, Java và JavaScript. Bạn có thể sử dụng chức năng regex ngay trong phiên bản cơ bản của các ngôn ngữ đó hoặc thông qua thư viện. Đối với hầu hết ngôn ngữ, cú pháp mẫu regex khá tương đồng.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu biểu thức chính quy trong R là gì, vì sao chúng quan trọng, những công cụ và hàm nào cho phép làm việc với chúng, các mẫu regex phổ biến nhất, và cách sử dụng. Cuối cùng, chúng ta sẽ điểm qua một số ứng dụng nâng cao của regex trong R.

Regex trong R là gì và vì sao bạn nên dùng?

Một biểu thức chính quy (regex) trong R là một dãy ký tự (thậm chí một ký tự) mô tả một mẫu nhất định xuất hiện trong văn bản. Mẫu regex có thể ngắn như ‘a’ hoặc dài như mẫu đề cập trong chủ đề trên StackOverflow.

Nhìn chung, định nghĩa trên về regex không chỉ áp dụng cho R mà còn cho mọi ngôn ngữ lập trình hỗ trợ biểu thức chính quy.

Regex là một công cụ rất linh hoạt và mạnh mẽ, được dùng rộng rãi để xử lý và khai thác dữ liệu văn bản phi cấu trúc. Chẳng hạn, chúng được ứng dụng trong công cụ tìm kiếm, phân tích từ vựng, lọc thư rác và các trình soạn thảo văn bản.

Công cụ và hàm làm việc với Regex trong R

Tuy mẫu regex tương tự nhau ở đa số ngôn ngữ, các hàm để làm việc với chúng lại khác nhau.

Trong R, chúng ta có thể dùng các hàm của base R để phát hiện, khớp, định vị, trích xuất và thay thế bằng regex. Dưới đây là các hàm chính tìm kiếm sự khớp regex trong một vector ký tự và thực hiện các thao tác sau:

  • grep(), grepl() – trả về chỉ số của các chuỗi có khớp (grep()) hoặc một vector logic cho biết chuỗi nào có khớp (grepl()).

  • regexpr(), gregexpr() – trả về vị trí bắt đầu khớp trong mỗi chuỗi và độ dài của phần khớp. regexpr() chỉ cung cấp thông tin cho lần khớp đầu tiên (từ trái qua), còn gregexpr() cho tất cả lần khớp.

  • sub(), gsub() – thay thế phần khớp phát hiện được trong mỗi chuỗi bằng một chuỗi chỉ định (sub() – chỉ thay lần khớp đầu tiên, gsub() – thay tất cả các lần khớp).

  • regexec() – hoạt động như regexpr() nhưng trả về thông tin tương tự cho một tiểu biểu thức chỉ định bên trong phần khớp.

  • regmatches() – hoạt động như regexec() nhưng trả về đúng các chuỗi được phát hiện cho toàn bộ phần khớp và cho tiểu biểu thức chỉ định.

Tuy nhiên, thay vì dùng các hàm gốc của R, một cách thuận tiện và nhất quán hơn để làm việc với regex trong R là dùng gói stringr thuộc bộ tidyverse. Thư viện này được xây dựng trên gói stringi. Trong stringr, tất cả hàm đều bắt đầu bằng str_ và có tên gọi trực quan hơn nhiều (kể cả tên tham số tuỳ chọn) so với base R.

Để cài đặt và nạp gói stringr, chạy lệnh sau:

install.packages('stringr')
library(stringr)

Bảng dưới đây cho thấy sự tương ứng giữa các hàm stringr và các hàm base R đã thảo luận ở phần này:

stringr

Base R

str_subset()

grep()

str_detect()

grepl()

str_extract()

regexpr(), regmatches(), grep()

str_match()

regexec()

str_locate()

regexpr()

str_locate_all()

gregexpr()

str_replace()

sub()

str_replace_all()

gsub()

Bạn có thể xem danh sách đầy đủ các hàm của stringr và biểu thức chính quy trong các cheat sheet này, nhưng chúng ta sẽ thảo luận một số hàm trong phần tiếp theo.

Lưu ý: trong các hàm của stringr, chúng ta truyền dữ liệu trước rồi đến regex, còn trong các hàm base R – thứ tự ngược lại.

Lưu ý khác: Hướng dẫn này dùng stringr 1.5.1, phiên bản hiện tại tính đến 2026. Nếu bạn dùng phiên bản cũ hơn, một số hành vi có thể khác — đặc biệt với str_view(), vốn đã được cập nhật đáng kể ở 1.5.0.

Các mẫu Regex trong R

Giờ, chúng ta sẽ điểm qua những mẫu regex phổ biến nhất trong R và cách dùng chúng, đồng thời luyện tập một số hàm của stringr.

Trước hết, hãy xem một ví dụ rất cơ bản. Cụ thể, hãy kiểm tra xem một con unicorn có ít nhất một cái "corn" không 😉

str_detect('unicorn', 'corn')

Kết quả:

TRUE

Trong ví dụ này, chúng ta dùng hàm str_detect() của stringr để kiểm tra sự xuất hiện của chuỗi corn trong chuỗi unicorn.

Tuy nhiên, thường thì chúng ta không tìm một chuỗi ký tự cố định mà là một mẫu nhất định – một biểu thức chính quy. Hãy cùng khám phá các mẫu như vậy.

Ký tự thoát (escape)

Một vài ký tự có ý nghĩa đặc biệt khi dùng trong regex của R. Cụ thể, chúng không khớp chính chúng như chữ và số, mà thực hiện điều khác:

str_extract_all('unicorn', '.')

Kết quả:

1. 'u' 'n' 'i' 'c' 'o' 'r' 'n'

Rõ ràng không có dấu chấm nào trong unicorn của chúng ta. Tuy vậy, hàm str_extract_all() đã trích xuất từng ký tự trong chuỗi. Đây chính là nhiệm vụ của ký tự . – khớp bất kỳ một ký tự đơn nào trừ xuống dòng.

Nếu muốn trích xuất một dấu chấm đúng nghĩa? Ta phải dùng ký tự thoát trước dấu chấm – dấu gạch chéo ngược (\). Tuy nhiên, cần lưu ý: dấu gạch chéo ngược cũng được dùng chính trong chuỗi như ký tự thoát. Nghĩa là ta cần “thoát ký tự thoát” trước, bằng hai dấu gạch chéo ngược. Xem thử:

str_extract_all('Eat. Pray. Love.', '\\.')

Kết quả:

1. '.' '.' '.'

Vậy, dấu gạch chéo ngược giúp vô hiệu hóa ý nghĩa đặc biệt của một số ký hiệu trong regex R và hiểu chúng theo nghĩa đen. Nó cũng có nhiệm vụ ngược lại: trao ý nghĩa đặc biệt cho một số ký tự vốn dĩ được hiểu theo nghĩa đen. Dưới đây là bảng các chuỗi thoát ký tự thường dùng:

Regex R

Khớp với

\b

Ranh giới từ (ranh giới giữa \w và \W)

\B

Không phải ranh giới từ (\w-\w hoặc \W-\W)

\n

Ký tự xuống dòng

\t

Ký tự tab

\v

Tab dọc

Xem một vài ví dụ, lưu ý rằng trong các trường hợp này ta cũng phải dùng hai dấu gạch chéo ngược. Đồng thời, chúng ta giới thiệu thêm hàm stringr: str_view() để xem HTML đánh dấu lần khớp đầu tiên hoặc tất cả lần khớp:

str_view('Unicorns are so cute!', 's\\b')
str_view('Unicorns are so cute!', 's\\B')

Kết quả:

Unicorns are so cute!
Unicorns are so cute!

Trong chuỗi Unicorns are so cute!, có hai chữ s. Ở trên, mẫu regex R thứ nhất tô sáng lần xuất hiện đầu tiên của chữ s (vì theo sau là dấu cách), còn mẫu thứ hai – lần thứ hai (vì theo sau là một chữ cái, không phải ranh giới từ).

Thêm vài ví dụ:

cat('Unicorns are\nso cute!')
str_view('Unicorns are\nso cute!', '\\n')

Kết quả:

Unicorns are
so cute!

Unicorns are_so cute!

cat('Unicorns are\tso cute!')
str_view('Unicorns are\tso cute!', '\\t')

Kết quả:

Unicorns are so    cute!

Unicorns are_so cute!

Lớp ký tự

Một lớp ký tự khớp với bất kỳ ký tự nào thuộc một tập ký tự xác định trước. Các lớp ký tự dựng sẵn có cú pháp giống với chuỗi thoát ký tự ở phần trước: một dấu gạch chéo ngược theo sau bởi một chữ cái được trao ý nghĩa đặc biệt thay vì nghĩa đen. Các cấu trúc phổ biến nhất như sau:

Regex R

Khớp với

\w

Bất kỳ ký tự thuộc từ (chữ cái, chữ số, hoặc gạch dưới)

\W

Bất kỳ ký tự không thuộc từ

\d

Bất kỳ chữ số nào

\D

Bất kỳ ký tự không phải chữ số

\s

Bất kỳ ký tự khoảng trắng (dấu cách, tab, xuống dòng, v.v.)

\S

Bất kỳ ký tự không phải khoảng trắng

Xem một số ví dụ dễ hiểu:

str_view('Unicorns are so cute!', '\\w')
str_view('Unicorns are so cute!', '\\W')

Kết quả:

[1] │ <U><n><i><c><o><r><n><s>< ><a><r><e>< ><s><o>< ><c><u><t><e>!
[1] │ Unicorns< >are< >so< >cute<!>
str_view('Unicorns are\nso cute!', '\\s')
str_view('Unicorns are\nso cute!', '\\S')

Kết quả:

Unicorns are<\n>so cute!
str_detect('Unicorns are so cute!', '\\d')

Kết quả:

FALSE

Các lớp ký tự dựng sẵn cũng có thể xuất hiện ở dạng thay thế – [:character_class_name:]. Một số lớp này tương đương với dạng có gạch chéo ngược; số khác thì không. Những lớp phổ biến nhất:

Regex R

Khớp với

[:alpha:]

Bất kỳ chữ cái nào

[:lower:]

Bất kỳ chữ thường nào

[:upper:]

Bất kỳ chữ hoa nào

[:digit:]

Bất kỳ chữ số nào (tương đương \d)

[:alnum:]

Bất kỳ chữ cái hoặc chữ số

[:xdigit:]

Bất kỳ chữ số thập lục phân

[:punct:]

Bất kỳ ký tự dấu câu nào

[:graph:]

Bất kỳ chữ cái, chữ số hoặc ký tự dấu câu

[:space:]

Dấu cách, tab, xuống dòng, v.v. (tương đương \s)

Hãy xem một số ví dụ, nhớ rằng cần đặt bất kỳ mẫu regex R nào ở trên trong dấu ngoặc vuông:

str_view('Unicorns are so cute!', '[[:upper:]]')
str_view('Unicorns are so cute!', '[[:lower:]]')

Kết quả:

Unicorns are so cute!

Unicorns are so cute!

str_detect('Unicorns are so cute!', '[[:digit:]]')

Kết quả:

FALSE
str_extract_all('Unicorns are so cute!', '[[:punct:]]')

Kết quả:

1. '!'
str_view('Unicorns are so cute!', '[[:space:]]')

Kết quả:

Unicorns_are_so_cute!

Bạn cũng có thể tạo lớp ký tự do người dùng định nghĩa bằng cách đặt trong ngoặc vuông bất kỳ tập ký tự nào mà từ đó ta muốn khớp một ký tự bất kỳ. Ta có thể bao gồm trong ngoặc vuông một khoảng chữ hoặc số (theo thứ tự Unicode), nhiều khoảng khác nhau, hoặc bất kỳ tập ký tự liên tiếp/không liên tiếp hay nhóm ký tự nào.

Ví dụ, [A-D] sẽ khớp bất kỳ chữ hoa từ A đến D (bao gồm), [k-r] – bất kỳ chữ thường từ k đến r, [0-7] – bất kỳ chữ số từ 0 đến 7, và [aou14%9] – bất kỳ ký tự nào nằm trong ngoặc vuông. Nếu đặt dấu mũ (⁠^) là ký tự đầu tiên trong ngoặc vuông, mẫu regex R sẽ khớp bất kỳ thứ gì ngoại trừ các ký tự đã cho. Lưu ý các cơ chế khớp ở trên là phân biệt chữ hoa/thường.

str_view('Unicorns Are SOOO Cute!', '[O-V]')
str_view('Unicorns Are SOOO Cute!', '[^O-V]')

Kết quả:

Unicorns Are SOOO Cute!

Unicorns Are SOOO Cute!

str_view('3.14159265359', '[0-2]')

Kết quả:

3.14159265359

str_view('The number pi is equal to 3.14159265359', '[n2e9&]')

Kết quả:

The number pi is equal to 3.14159265359

Bộ đếm lặp (Quantifier)

Thường chúng ta cần khớp lặp lại một mẫu regex R nào đó thay vì đúng một lần. Để làm vậy, ta dùng bộ đếm lặp. Bộ đếm lặp luôn đứng sau mẫu regex mà nó áp dụng. Các bộ đếm phổ biến nhất như trong bảng dưới:

Regex R

Số lần lặp mẫu

*

0 lần hoặc nhiều hơn

+

ít nhất 1 lần

?

nhiều nhất 1 lần

{n}

chính xác n lần

{n,}

ít nhất n lần

{n,m}

ít nhất n và nhiều nhất m lần

Hãy thử tất cả:

str_extract('dog', 'dog\\d*')

Kết quả:

'dog'

Chúng ta nhận lại chuỗi ban đầu dog: không có chữ số ở cuối chuỗi, nhưng điều đó vẫn chấp nhận (0 hoặc nhiều chữ số).

str_extract('12345', '\\d+')

Kết quả:

'12345'
str_extract('12345', '\\d?')

Kết quả:

'1'
str_extract('12345', '\\d{3}')

Kết quả:

'123'
str_extract('12345', '\\d{7,}')

Kết quả:

NA

Chúng ta nhận NA vì không có ít nhất 7 chữ số trong chuỗi, chỉ có 5.

str_extract('12345', '\\d{2,4}')

Kết quả:

'1234'

Mỏ neo (Anchors)

Mặc định, regex R sẽ khớp ở bất kỳ phần nào của chuỗi đã cho. Ta có thể thay đổi hành vi này bằng cách chỉ định vị trí nhất định của mẫu regex trong chuỗi. Thường nhất, ta muốn ép khớp từ đầu hoặc cuối chuỗi. Để làm vậy, dùng hai mỏ neo chính trong regex R:

  • ^ – khớp từ đầu chuỗi (với chuỗi nhiều dòng – đầu mỗi dòng)

  • $ – khớp từ cuối chuỗi (với chuỗi nhiều dòng – cuối mỗi dòng)

Hãy xem cách chúng hoạt động với ví dụ palindrome stella won no wallets:

str_view('stella won no wallets', '^s')
str_view('stella won no wallets', 's$')

Kết quả:

<s>tella won no wallets
stella won no wallet<s>

Nếu muốn khớp chính các ký tự ^ hoặc $, ta cần đặt trước ký tự quan tâm một dấu gạch chéo ngược (gấp đôi):

str_view('Do not have 100$, have 100 friends', '\\$')

Kết quả:

Do not have 100$, have 100 friends

Ta cũng có thể gắn neo vào ranh giới từ hoặc không phải ranh giới từ bên trong chuỗi (lần lượt là \b và \B):

str_view('road cocoa oasis oak boa coach', '\\boa')
str_view('road cocoa oasis oak boa coach', 'oa\\b')
str_view('road cocoa oasis oak boa coach', 'oa\\B')

Kết quả:

road cocoa oasis oak boa coach

road cocoa oasis oak boa coach

road cocoa oasis oak boa coach

Ở trên, chúng ta khớp tổ hợp chữ oa:

  • Ví dụ 1 – ở đầu từ
  • Ví dụ 2 – ở cuối từ
  • Ví dụ 3 – khi theo sau là ký tự thuộc từ (trong trường hợp này – là chữ cái)

Phép chọn (Alternation)

Dùng toán tử thay thế (|), chúng ta có thể khớp nhiều hơn một mẫu regex R trong cùng một chuỗi. Lưu ý rằng nếu dùng toán tử này như một phần của lớp ký tự do người dùng định nghĩa, nó được hiểu theo nghĩa đen, vì vậy không thực hiện phép thay thế.

str_view('coach koala board oak cocoa road boa load coat oasis boat', 'boa|coa')

Kết quả:

coach koala board oak cocoa road boa load coat oasis boat

Trong ví dụ trên, chúng ta khớp tất cả lần xuất hiện của boa hoặc coa.

Nhóm (Grouping)

Các mẫu regex R tuân theo một số quy tắc ưu tiên. Ví dụ, lặp (dùng bộ đếm) được ưu tiên hơn gắn neo, trong khi gắn neo lại ưu tiên hơn phép chọn. Để ghi đè các quy tắc này và tăng ưu tiên cho một thao tác nhất định, ta nên dùng nhóm. Thao tác này thực hiện bằng cách đặt một tiểu biểu thức quan tâm trong dấu ngoặc tròn.

Nhóm phát huy hiệu quả nhất khi kết hợp với toán tử thay thế. Các ví dụ dưới đây minh họa rõ tác dụng của sự kết hợp này:

str_view('code rat coat cot cat', 'co|at')
str_view('code rat coat cot cat', 'c(o|a)t')

Kết quả:

code rat coat cot cat

code rat coat cot cat

Ứng dụng nâng cao của Biểu thức Chính quy trong R

Mọi thứ đã bàn đến đây cung cấp nền tảng tốt để bắt đầu làm việc với regex trong R. Tuy nhiên, còn rất nhiều điều có thể làm với công cụ mạnh mẽ này. Không đi sâu chi tiết, hãy chỉ điểm qua một số thao tác nâng cao có thể thực hiện với regex trong R:

  • Ghi đè thiết lập mặc định của các hàm stringr
  • Khớp cụm chữ tượng hình (grapheme cluster)
  • Tham chiếu ngược nhóm (backreference)
  • Khớp thuộc tính Unicode
  • Áp dụng kỹ thuật thoát ký tự nâng cao
  • Kiểm tra sự tồn tại của mẫu mà không đưa vào kết quả (lookaround)
  • Biến cơ chế lặp của mẫu thành lười thay vì tham lam
  • Làm việc với nhóm nguyên tử (atomic group)

Tìm hiểu thêm trong khóa học Intermediate Regular Expressions in R.

Thử thách Regex trong R

Bây giờ đến lượt bạn thực hành các mẫu regex R đã thảo luận trong hướng dẫn này. Hãy dùng Bộ dữ liệu: Internet News and Consumer Engagement, và thử làm điều sau: trích xuất miền cấp cao nhất (TLD) từ tất cả URL. Một số ví dụ TLD là com, net, uk, v.v.

Có nhiều cách để hoàn thành bài này, bao gồm các lời giải một dòng gọn gàng và súc tích (gợi ý: bạn có thể tìm hiểu thêm về lookaround trong regex R đã nhắc ở phần trước và dùng chúng để giải quyết). Hãy cân nhắc gợi ý rất lỏng cho một cách tiếp cận tương đối “tập sự” dưới đây:

  • Quan sát một số URL trong bộ dữ liệu và nhận ra những mẫu nào luôn xuất hiện trong bất kỳ URL nào trước TLD và mẫu nào là tùy chọn
  • Xem có mẫu nào là bắt buộc trong bất kỳ URL nào sau TLD (nếu có thì là gì) và mẫu nào là tùy chọn
  • Loại bỏ mọi thứ trước TLD của URL
  • Loại bỏ mọi thứ sau TLD của URL

Để giải quyết theo thuật toán trên, bạn không cần làm hay học thêm gì nữa. Chỉ cần ôn lại mọi thứ đã bàn trong hướng dẫn này và áp dụng. Cụ thể, bạn sẽ cần các hàm của stringr, ký tự thoát, lớp ký tự, bộ đếm lặp và nhóm.

Thưởng: Thử thách #2

Nếu muốn luyện thêm, lần này không có gợi ý, hãy thử làm điều sau: dùng cùng bộ dữ liệu ở thử thách trước, trích xuất tên miền từ tất cả URL. Ví dụ về tên miền là google trong URL www.google.com.

Kết luận

Tổng kết lại, trong hướng dẫn này, chúng ta đã học nhiều điều về biểu thức chính quy trong R. Cụ thể, chúng ta đã thảo luận:

  • Regex trong R là gì
  • Vì sao chúng quan trọng và nơi chúng được áp dụng
  • Những hàm nào (từ R gốc và thư viện chuyên dụng) dùng để làm việc với regex trong R
  • Các mẫu regex R phổ biến nhất cùng phạm vi, sắc thái và lưu ý
  • Khi nào và cách dùng ký tự thoát, lớp ký tự, bộ đếm, mỏ neo, phép chọn và nhóm với regex R
  • Nhiều ví dụ áp dụng regex R và các hàm
  • Một số thao tác nâng cao với biểu thức chính quy trong R

Những kỹ năng và khái niệm này sẽ giúp ích cho bạn khi làm việc trong R và nhiều ngôn ngữ lập trình khác, vì khái niệm biểu thức chính quy là như nhau và cú pháp regex cũng khá tương đồng ở đa số ngôn ngữ.

Nếu bạn muốn nâng cao kỹ năng R, hãy tham khảo các khóa học, lộ trình kỹ năng và bài viết sau của DataCamp:


Elena Kosourova's photo
Author
Elena Kosourova
LinkedIn

Nhà khoa học dữ liệu được chứng nhận bởi IBM (2020), trước đây là Nhà địa chất/Người xây dựng mô hình địa chất cho các mỏ dầu khí trên toàn thế giới với hơn 12 năm kinh nghiệm làm việc quốc tế. Thành thạo Python, R và SQL. Lĩnh vực chuyên môn: làm sạch dữ liệu, xử lý dữ liệu, trực quan hóa dữ liệu, phân tích dữ liệu, mô hình hóa dữ liệu, thống kê, kể chuyện bằng dữ liệu, học máy. Có nhiều kinh nghiệm trong quản lý cộng đồng khoa học dữ liệu và viết/biên tập bài viết, hướng dẫn về khoa học dữ liệu và định hướng nghề nghiệp.

FAQs

Làm sao kiểm tra phiên bản stringr hiện có và cập nhật nó?

Chạy lệnh này trong R console của bạn:

packageVersion('stringr')

Nếu kết quả hiển thị thấp hơn 1.5.0, hãy cập nhật bằng:

install.packages('stringr')
 

str_view_all() có bao giờ dừng hoạt động hoàn toàn không, hay giờ dùng vẫn an toàn?

Hiện tại nó vẫn hoạt động trong phiên bản stringr mới và sẽ còn tiếp tục một thời gian — deprecation trong R không đồng nghĩa loại bỏ ngay. Tuy nhiên, mỗi lần gọi sẽ sinh cảnh báo, rất ồn. Quan trọng hơn, các hàm bị deprecate cuối cùng sẽ bị gỡ ở các bản phát hành lớn tương lai, nên mã dựa vào str_view_all() rồi cũng sẽ hỏng. Sửa mất khoảng 30 giây, nên làm ngay sẽ tốt hơn.

Vì sao tôi cần dùng hai dấu gạch chéo ngược (\\) trong regex R trong khi ngôn ngữ khác chỉ cần một?

Đáp: Vì R xử lý chuỗi trước khi chuyển cho engine regex. Một \ đơn sẽ bị bộ phân tích chuỗi của R tiêu thụ, nên bạn cần \\ để đảm bảo một \ thực sự tới được engine regex. Viết \\d thì R sẽ chuyển thành \d cho regex — viết \d thì hỏng trước khi regex nhìn thấy.

Sự khác nhau giữa grep() và grepl() trong base R là gì, và nên dùng cái nào?

grep() trả về chỉ số phần tử khớp; grepl() trả về một vector TRUE/FALSE có cùng độ dài với đầu vào. Dùng grep() khi bạn cần vị trí, và grepl() khi muốn lọc hoặc kiểm tra. Trên thực tế, các hàm tương đương trong stringr là str_subset() và str_detect() thường gọn gàng hơn cho đa số trường hợp.

Khi nào nên dùng lớp ký tự như [aeiou] so với phép chọn a|e|i|o|u?

Với các ký tự đơn, luôn dùng lớp ký tự — nhanh và gọn hơn. Dùng phép chọn với | khi bất kỳ lựa chọn nào dài hơn một ký tự, như cat|dog, vì những cái đó không thể đặt trong [].

Sự khác nhau giữa các bộ đếm *, + và ? là gì?

* = không hoặc nhiều lần (mẫu là tùy chọn và có thể lặp). + = một hoặc nhiều (cần ít nhất một). ? = không hoặc một (tùy chọn, không lặp). Mẹo nhớ: + là “cộng” (yêu cầu ít nhất một), ? là “hỏi” (có thể có, có thể không), * là “tùy ý”.

Sự khác nhau giữa sub() và gsub(), và các hàm tương đương trong stringr là gì?

sub() chỉ thay lần khớp đầu tiên; gsub() thay tất cả các lần khớp. Các hàm tương đương trong stringr là str_replace() và str_replace_all(). Phiên bản stringr được ưa chuộng vì theo thứ tự tham số của tidyverse — dữ liệu trước, mẫu sau, rồi đến chuỗi thay thế.

Khi nào dùng regexpr() so với gregexpr() trong base R?

regexpr() tìm vị trí của lần khớp đầu tiên trong mỗi chuỗi; gregexpr() tìm tất cả lần khớp. Đa số người dùng R thích str_locate() và str_locate_all() của stringr hơn — chúng trả về kết quả dạng data frame gọn gàng với cột start và end thay vì định dạng số nguyên đặt tên khó dùng của base R.

Dấu ^ có nghĩa gì bên trong dấu ngoặc vuông so với bên ngoài?

Bên ngoài [], nó là mỏ neo đầu chuỗi: ^Hello khớp các chuỗi bắt đầu bằng "Hello". Bên trong [] ở vị trí đầu tiên, nó phủ định tập: [^aeiou] khớp bất kỳ thứ gì không phải nguyên âm. Ở vị trí khác bên trong [], nó được hiểu là dấu mũ theo nghĩa đen.

Khi nào nên dùng ranh giới từ \b thay vì mỏ neo ^ và $?

Dùng \b khi bạn muốn khớp cả một từ ở bất kỳ đâu trong chuỗi, không chỉ ở đầu hay cuối. Tìm cat cũng khớp với "concatenated" — còn \bcat\b chỉ khớp từ đơn lẻ. Điều này đặc biệt hữu ích trong phân tích văn bản khi các khớp một phần có thể làm sai lệch kết quả.

Chủ đề
R

Các khóa học R hàng đầu

Khóa học

R nâng cao

6 giờ
679.6K
Tiếp tục hành trình trở thành một chuyên gia R bằng cách tìm hiểu về các câu lệnh điều kiện, vòng lặp và hàm vectơ.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm