JavaRush /Blog Java /Random-VI /RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy...
Artur
Mức độ
Tallinn

RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 2

Xuất bản trong nhóm
RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 1 Bản gốc ở đây Trong phần trước, chúng ta đã nắm vững các biểu thức chính quy đơn giản nhất và đã học được điều gì đó. Trong phần này, chúng ta sẽ nghiên cứu các thiết kế phức tạp hơn một chút, nhưng tin tôi đi, nó sẽ không khó như bạn tưởng. RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 2 - 1Vậy chúng ta hãy tiếp tục!

Bước 8: Dấu sao *và dấu cộng+

RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 2 - 2Cho đến nay, chúng ta ít nhiều chỉ có thể khớp các chuỗi có độ dài nhất định. Nhưng trong những vấn đề mới nhất, chúng ta đã tiến gần đến giới hạn những gì chúng ta có thể làm với ký hiệu mà chúng ta đã thấy cho đến nay. Ví dụ: giả sử rằng chúng ta không bị giới hạn ở các mã định danh Java gồm 3 ký tự nhưng chúng ta có thể có các mã định danh có độ dài bất kỳ. Một giải pháp có thể hiệu quả trong ví dụ trước sẽ không hiệu quả trong ví dụ sau:
mẫu: [a-zA-Z_$]\w\w 
chuỗi:   __e $12 3 3.2 cho Thanh r a23 mm ab x
trận đấu: ^^^ ^^^ ^^^ ^^^  
( Ví dụ ) ghi chúrằng khi mã định danh hợp lệ nhưng dài hơn 3 ký tự thì chỉ có ba ký tự đầu tiên được khớp. Và khi mã định danh hợp lệ nhưng chứa ít hơn 3 ký tự thì Regex hoàn toàn không tìm thấy nó! Vấn đề là các biểu thức trong ngoặc []khớp chính xác với một ký tự, cũng như các lớp ký tự như \w. Điều này có nghĩa là mọi kết quả trùng khớp trong biểu thức chính quy ở trên phải dài chính xác ba ký tự. Vì vậy, nó không hoạt động tốt như chúng ta mong đợi. *Các ký tự đặc biệt và có thể giúp đỡ ở đây +. Đây là những công cụ sửa đổi có thể được thêm vào bên phải của bất kỳ biểu thức nào để khớp với biểu thức đó nhiều lần. Kleene Star (hoặc "dấu hoa thị") *sẽ cho biết mã thông báo trước đó phải được khớp với số lần bất kỳ, kể cả số lần bằng 0. Dấu cộng +sẽ cho biết bạn cần tìm kiếm một hoặc nhiều lần. Do đó, biểu thức đứng trước +là bắt buộc (ít nhất một lần), trong khi biểu thức đứng trước *là tùy chọn, nhưng khi xuất hiện, nó có thể xuất hiện bao nhiêu lần cũng được. Bây giờ, với kiến ​​thức này, chúng ta có thể sửa biểu thức chính quy ở trên:
mẫu: [a-zA-Z_$]\w* 
chuỗi:   __e $123 3,2 cho Barr a23mm ab x 
khớp: ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^ 
( Ví dụ ) Bây giờ chúng tôi khớp các mã định danh hợp lệ có độ dài bất kỳ! Chơi lô tô! Nhưng điều gì sẽ xảy ra nếu chúng ta sử dụng ? +thay vì *?
mẫu: [a-zA-Z_$]\w+ 
chuỗi:   __e $123 3.2 cho Barr a23mm ab x
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
( Ví dụ ) Chúng tôi đã bỏ lỡ trận đấu cuối cùng, х. Điều này là do nó yêu cầu +ít nhất một ký tự phải khớp, nhưng vì biểu thức được đặt trong dấu ngoặc đơn []trước đó \w+đã 'ăn' ký tự đó xnên không còn ký tự nào nữa nên khớp không thành công. Khi nào chúng ta có thể sử dụng +? Khi chúng ta cần tìm ít nhất một kết quả khớp, nhưng việc một biểu thức đã cho phải khớp bao nhiêu lần không quan trọng. Ví dụ: nếu chúng ta muốn tìm bất kỳ số nào có chứa dấu thập phân:
mẫu: \d*\.\d+ 
chuỗi:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
kết quả phù hợp: ^^^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^  
( Ví dụ ) ghi chúrằng bằng cách tùy chọn các số ở bên trái dấu thập phân, chúng ta có thể tìm thấy cả 0,011 và 0,2. Để làm điều này, chúng tôi cần khớp chính xác một dấu thập phân với \.và ít nhất một chữ số ở bên phải dấu thập phân với \d+. Biểu thức chính quy ở trên sẽ không khớp với một số như 3., vì chúng ta cần ít nhất một chữ số ở bên phải dấu thập phân để khớp.

Như thường lệ, hãy giải quyết một số vấn đề đơn giản:

Tìm tất cả các từ tiếng Anh trong đoạn văn dưới đây.
mẫu:
chuỗi: 3 cộng 3 là sáu nhưng 4 cộng ba là 7
trận đấu:    ^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^ ^^^ ^^ 
( Giải pháp ) Tìm tất cả các ký hiệu kích thước tệp trong danh sách bên dưới. Kích thước tệp sẽ bao gồm một số (có hoặc không có dấu thập phân), theo sau là KB, MB, GBhoặc TB:
mẫu:
chuỗi:   11TB 13 14,4MB 22HB 9,9GB TB 0KB 
phù hợp: ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^  
( Giải pháp )

Bước 9: dấu chấm hỏi "tùy chọn"?

RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 2 - 3Bạn đã viết biểu thức chính quy để giải quyết vấn đề cuối cùng chưa? Nó có hoạt động không? Bây giờ hãy thử áp dụng nó ở đây:
mẫu:
chuỗi: 1..3KB 5...GB ..6TB
diêm:  
Rõ ràng, cả hai chỉ định này đều không phải là kích thước tệp hợp lệ, do đó, một biểu thức chính quy tốt sẽ không khớp với một trong hai ký hiệu đó. Giải pháp tôi viết để giải quyết vấn đề cuối cùng phù hợp với tất cả, ít nhất một phần:
mẫu: \d+\.*\d*[KMGT]B 
chuỗi:   1..3KB  5...GB .. 6TB 
khớp: ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
( Ví dụ ) Vậy vấn đề là gì? Trên thực tế, chúng ta chỉ cần tìm một dấu thập phân, nếu có. Nhưng *nó cho phép bất kỳ số lượng kết quả phù hợp nào, bao gồm cả số không. Có cách nào để chỉ khớp 0 lần hoặc một lần không? Nhưng không quá một lần? Tất nhiên là có. "tùy chọn" ?là từ bổ nghĩa khớp với 0 hoặc một trong các ký tự trước đó, nhưng không khớp nữa:
mẫu: \d+\.?\d*[KMGT]B 
chuỗi: 1.. 3KB 5...GB .. 6TB 
khớp:     ^^^ ^^^ 
( Ví dụ ) Ở đây chúng ta đang tiến gần hơn đến một giải pháp, nhưng đây không hẳn là điều chúng ta cần. Chúng ta sẽ xem cách khắc phục điều này trong một vài bước sau.

Trong lúc chờ đợi, hãy giải quyết vấn đề này:

Trong một số ngôn ngữ lập trình (ví dụ: Java), một số số nguyên và số dấu phẩy động (dấu chấm) có thể được theo sau bởi l/ Lf/ Fđể biểu thị rằng chúng nên được coi là long/float (tương ứng) thay vì int/double thông thường. Tìm tất cả các số "dài" hợp lệ trong dòng bên dưới:
mẫu:
chuỗi:   13L dài 2l 19 L lL 0 
trận: ^^^ ^^ ^^ ^ 
( Giải pháp )

Bước 10: ký hiệu “hoặc”|

RegEx: 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 2 - 4Ở bước 8, chúng tôi gặp một số khó khăn khi tìm các loại số dấu phẩy động khác nhau:
mẫu: \d*\.\d+ 
chuỗi:   0,011 .2 42 2,0 3,33 4,000 5 6 7,89012 
kết quả phù hợp: ^^^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^  
Mẫu trên khớp với các số có dấu thập phân và ít nhất một chữ số ở bên phải dấu thập phân. Nhưng nếu chúng ta cũng muốn khớp các chuỗi như thế nào thì sao 0.? (Không có số nào ở bên phải dấu thập phân.) Chúng ta có thể viết một biểu thức chính quy như thế này:
mẫu: \d*\.\d* 
chuỗi:   0,011 .2 42 2,0 3,33 4,000 5 6 7.89012 0. . 
trận đấu: ^^ ^^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^ ^^ ^ 
( Ví dụ ) Cái này khớp với 0., nhưng nó cũng khớp với một điểm duy nhất ., như bạn có thể thấy ở trên. Trên thực tế những gì chúng tôi đang cố gắng so khớp là hai lớp chuỗi khác nhau:
  1. số có ít nhất một chữ số ở bên phải dấu thập phân
  2. số có ít nhất một chữ số ở bên trái dấu thập phân
Hãy viết 2 biểu thức chính quy sau đây, độc lập với nhau:
mẫu: \d*\.\d+ 
chuỗi:   0,011 .2 42 2,0 3,33 4,000 5 6 7.89012 0. .
trận đấu: ^^ ^^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^  
mẫu: \d+\.\d* 
chuỗi:   0,011 .2 42 2,0 3,33 4,000 5 6 7.89012 0. .
trận đấu: ^^ ^^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^ ^^ 
Chúng tôi thấy rằng không có trường hợp nào trong số này các chuỗi con 42, 5, 6hoặc .được công cụ tìm thấy. Để có được kết quả cần thiết, chúng ta sẽ không hại gì khi kết hợp các biểu thức chính quy này. Làm thế nào chúng ta có thể đạt được điều này? Dấu "hoặc" |cho phép chúng ta chỉ định một số chuỗi kết quả khớp có thể có cùng một lúc trong một biểu thức chính quy. Giống như []dấu "hoặc" cho phép chúng ta chỉ định các ký tự đơn thay thế, |chúng ta có thể chỉ định các biểu thức nhiều ký tự thay thế. Ví dụ: nếu muốn tìm "chó" hoặc "mèo", chúng ta có thể viết như thế này:
mẫu: \w\w\w 
string:   Rõ ràng , một con chóthú cưng tốt hơn một con mèo .
trận đấu: ^^ ^^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
( Ví dụ ) ... nhưng điều này khớp với tất cả các chuỗi ký tự ba của lớp "word". Nhưng "dog" và "cat" thậm chí không có chữ cái chung, vì vậy dấu ngoặc vuông sẽ không giúp ích gì cho chúng ta ở đây. Đây là biểu thức chính quy đơn giản nhất mà chúng ta có thể sử dụng để khớp với cả hai và chỉ hai từ sau:
mẫu: dog|cat 
string: Rõ ràng, chó là thú cưng tốt hơn mèo .
trận đấu:               ^^^ ^^^ 
( Ví dụ ) Trước tiên, công cụ biểu thức chính quy cố gắng khớp toàn bộ chuỗi ở bên trái của ký tự |, nhưng nếu thất bại, nó sẽ cố gắng khớp chuỗi ở bên phải ký tự |. Nhiều ký tự |cũng có thể được xâu chuỗi để khớp với nhiều hơn hai chuỗi thay thế:
mẫu: dog|cat|pet 
string: Rõ ràng, chó là thú cưng tốt hơn mèo .
trận đấu:               ^^^ ^^^ ^^^ 
( Ví dụ )

Bây giờ hãy giải quyết một số vấn đề khác để hiểu rõ hơn về bước này:

Sử dụng dấu |để sửa biểu thức chính quy thập phân ở trên để tạo ra kết quả như sau:
mẫu:
chuỗi:   0,011 ,2 42 2,0 3,33 4,000 5 6 7,89012 0. .
trận đấu: ^^ ^^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^^ ^^ 
( Giải pháp ) Sử dụng dấu |, các lớp ký tự, "tùy chọn" ?, v.v. để tạo một biểu thức chính quy khớp với cả số nguyên và số dấu chấm động (dấu chấm), như đã thảo luận trong bài toán ở cuối bước trước (vấn đề này hơi khó phức tạp hơn, vâng ;))
mẫu:
chuỗi:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^^ ^^  
( Giải pháp ) 20 bước ngắn để thành thạo các biểu thức chính quy. Phần 3 RegEx: 20 bước ngắn để thành thạo biểu thức chính quy. Phần 4
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION