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 3

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. RegEx: 20 bước ngắn để thành thạo biểu thức chính quy. Phần 2: Trong phần này chúng ta sẽ chuyển sang những thứ phức tạp hơn một chút. Nhưng việc làm chủ chúng như trước đây sẽ không khó. Tôi nhắc lại rằng RegEx thực sự dễ dàng hơn lúc đầu và bạn không cần phải là một nhà khoa học tên lửa để thành thạo nó và bắt đầu sử dụng nó trong thực tế. Bản gốc tiếng Anh của bài viết này ở đây . 20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 1

Bước 11: Dấu ngoặc đơn ()là nhóm thu thập

20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 2Trong bài toán trước, chúng ta đã tìm kiếm các loại giá trị số nguyên và giá trị số dấu chấm động (dấu chấm) khác nhau. Nhưng công cụ biểu thức chính quy không phân biệt giữa hai loại giá trị này vì mọi thứ đều được ghi lại trong một biểu thức chính quy lớn. Chúng ta có thể yêu cầu công cụ biểu thức chính quy phân biệt giữa các loại kết quả khớp khác nhau nếu chúng ta đặt các mẫu nhỏ trong ngoặc đơn:
mẫu: ([AZ])|([az]) 
string:   Tổng thống hiện tại của Bolivia là Evo Morales .
trận đấu: ^^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^^ ^^ ^^^ ^^ ^^ ^^^ 
nhóm:    122 2222222 122222222 22 1222222 22 122 1222222  
( Ví dụ ) Biểu thức chính quy ở trên xác định hai nhóm chụp được lập chỉ mục bắt đầu từ 1. Nhóm chụp đầu tiên khớp với bất kỳ chữ cái viết hoa nào và nhóm chụp thứ hai khớp với bất kỳ chữ cái viết thường nào. Bằng cách sử dụng dấu 'hoặc' |và dấu ngoặc đơn ()làm nhóm thu thập, chúng ta có thể xác định một biểu thức chính quy duy nhất khớp với nhiều loại chuỗi. Nếu chúng ta áp dụng điều này cho biểu thức chính quy tìm kiếm dài/thả nổi từ phần trước của bài viết thì công cụ biểu thức chính quy sẽ ghi lại các kết quả khớp tương ứng trong các nhóm thích hợp. Bằng cách kiểm tra xem chuỗi con khớp với nhóm nào, chúng ta có thể xác định ngay xem đó là giá trị float hay giá trị dài:
mẫu: (\d*\.\d+[fF]|\d+\.\d*[fF]|\d+[fF])|(\d+[lL]) 
chuỗi:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0.
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^ ^^^ 
nhóm:    222 1111 22 11 111  
( Ví dụ ) Biểu thức chính quy này khá phức tạp và để hiểu rõ hơn về nó, hãy chia nhỏ nó ra và xem xét từng mẫu sau:
( // khớp với bất kỳ chuỗi con "float" nào
  \d*\.\d+[fF]
  |
  \d+\.\d*[fF]
  |
  \d+[fF]
)
| // HOẶC
( // khớp với bất kỳ chuỗi con "dài" nào
  \d+[lL]
)
Các nhóm ký hiệu |và bắt giữ trong ngoặc đơn ()cho phép chúng ta so khớp các loại chuỗi con khác nhau. Trong trường hợp này, chúng tôi đang khớp số dấu phẩy động "float" hoặc số nguyên dài "dài".
(
  \d*\.\d+[fF] // Hơn 1 chữ số ở bên phải dấu thập phân
  |
  \d+\.\d*[fF] // Hơn 1 chữ số ở bên trái dấu thập phân
  |
  \d+[fF] // không có dấu chấm, chỉ có hơn 1 chữ số
)
|
(
  \d+[lL] // không có dấu chấm, chỉ có hơn 1 chữ số
)
Trong nhóm chụp "float", chúng ta có ba tùy chọn: số có ít nhất 1 chữ số ở bên phải dấu thập phân, số có ít nhất 1 chữ số ở bên trái dấu thập phân và số không có dấu thập phân. Bất kỳ cái nào trong số chúng đều là "float" miễn là chúng có các chữ cái "f" hoặc "F" được thêm vào cuối. Bên trong nhóm chụp "dài", chúng tôi chỉ có một tùy chọn - chúng tôi phải có 1 hoặc nhiều chữ số theo sau là ký tự "l" hoặc "L". Công cụ biểu thức chính quy sẽ tìm kiếm các chuỗi con này trong một chuỗi nhất định và lập chỉ mục chúng vào nhóm thu thập thích hợp. ghi chúrằng chúng tôi không khớp với bất kỳ số nào không có bất kỳ số "l", "L", "f" hoặc "F" nào được thêm vào chúng. Những con số này nên được phân loại như thế nào? Chà, nếu chúng có dấu thập phân thì ngôn ngữ Java mặc định là "gấp đôi". Nếu không thì chúng phải là "int".

Hãy củng cố những gì chúng ta đã học được bằng một vài câu đố:

Thêm hai nhóm chụp nữa vào biểu thức chính quy trên để nó cũng phân loại các số double hoặc int. (Đây là một câu hỏi khó khác, đừng nản lòng nếu phải mất một thời gian, phương án cuối cùng là hãy xem giải pháp của tôi.)
mẫu:
chuỗi:   42L 12 x 3.4f 6l 3.3 0F LF .2F 0. 
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^^ ^^ 
nhóm:    333 44 1111 33 222 11 111 22
( Giải pháp ) Vấn đề tiếp theo đơn giản hơn một chút. Sử dụng các nhóm chụp trong ngoặc (), ký hiệu 'hoặc' |và phạm vi ký tự để sắp xếp các độ tuổi sau: "uống hợp pháp ở Hoa Kỳ". (>= 21) và “không được phép uống rượu ở Mỹ” (<21):
mẫu:
chuỗi:   7 10 17 18 19 20 21 22 23 24 30 40 100 120 
trận đấu: ^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ 
nhóm:    2 22 22 22 22 22 11 11 11 11 11 11 111 111 
( Giải pháp )

Bước 12: Trước tiên, hãy xác định các kết quả phù hợp cụ thể hơn

20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 3Bạn có thể gặp một số rắc rối với nhiệm vụ cuối cùng nếu bạn cố gắng xác định "những người uống rượu hợp pháp" là nhóm bị bắt đầu tiên chứ không phải nhóm thứ hai. Để hiểu tại sao, chúng ta hãy xem một ví dụ khác. Giả sử chúng ta muốn ghi riêng những họ có ít hơn 4 ký tự và những họ có 4 ký tự trở lên. Hãy đặt tên ngắn hơn cho nhóm chụp đầu tiên và xem điều gì sẽ xảy ra:
mẫu: ([AZ][az]?[az]?)|([AZ][az][az][az]+) 
string:   Kim Job s Xu Clo yd Moh r Ngo Roc k.
trùng khớp: ^^^ ^^^ ^^ ^^^ ^^^ ^^^ ^^^ 
nhóm:    111 111 11 111 111 111 111   
( Ví dụ ) Theo mặc định, hầu hết các công cụ biểu thức chính quy đều sử dụng kết hợp tham lam với các ký tự cơ bản mà chúng ta đã thấy cho đến nay. Điều này có nghĩa là công cụ biểu thức chính quy sẽ nắm bắt nhóm dài nhất được xác định càng sớm càng tốt trong biểu thức chính quy được cung cấp. Vì vậy, mặc dù nhóm thứ hai ở trên có thể bắt được nhiều ký tự hơn trong các tên như "Jobs" và "Cloyd", nhưng vì ba ký tự đầu tiên của những tên đó đã được nhóm bắt giữ đầu tiên nắm bắt nên chúng không thể bị bắt lại bởi nhóm thứ hai. . Bây giờ, hãy thực hiện một chỉnh sửa nhỏ - chỉ cần thay đổi thứ tự của các nhóm chụp, đặt nhóm cụ thể hơn (dài hơn) trước:
mẫu: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    222 1111 22 11111 1111 222 1111    
( Ví dụ )

Nhiệm vụ... lần này chỉ có một :)

Mẫu "cụ thể hơn" hầu như luôn có nghĩa là "dài hơn". Giả sử chúng ta muốn tìm hai loại "từ": đầu tiên là những từ bắt đầu bằng nguyên âm (cụ thể hơn), sau đó là những loại không bắt đầu bằng nguyên âm (bất kỳ từ nào khác). Hãy thử viết biểu thức chính quy để nắm bắt và xác định các chuỗi khớp với hai nhóm này. (Các nhóm bên dưới được đánh chữ chứ không phải đánh số. Bạn phải xác định nhóm nào tương ứng với nhóm đầu tiên và nhóm nào tương ứng với nhóm thứ hai.)
mẫu:
chuỗi:   pds6f uub 24r2gp ewqrty l ui_op 
khớp: ^^^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ 
nhóm:    NNNNN VVV NNNNNN VVVVVV N VVVVV
( Giải pháp ) Nói chung, biểu thức chính quy của bạn càng chính xác thì kết quả sẽ càng dài. Và càng chính xác thì khả năng bạn chụp được thứ mình không cần càng ít. Vì vậy, mặc dù chúng có thể trông đáng sợ, nhưng các biểu thức chính quy dài hơn ~= sẽ tốt hơn. Không may .

Bước 13: Niềng răng xoăn {}cho số lần lặp lại cụ thể

20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 4Trong ví dụ với họ ở bước trước, chúng ta có 2 nhóm gần như lặp lại trong một mẫu:
mẫu: ([AZ][az][az][az]+)|([AZ][az]?[az]?) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    222 1111 22 11111 1111 222 1111    
Đối với nhóm đầu tiên, chúng tôi cần họ có bốn chữ cái trở lên. Nhóm thứ hai phải lấy những họ có ba chữ cái trở xuống. Có cách nào dễ dàng hơn để viết điều này hơn là lặp đi lặp [a-z]lại các nhóm này không? Tồn tại nếu bạn sử dụng dấu ngoặc nhọn cho việc này {}. Dấu ngoặc nhọn {}cho phép chúng ta chỉ định số lượng khớp tối thiểu và (tùy chọn) tối đa của ký tự hoặc nhóm chụp trước đó. Có ba trường hợp sử dụng {}:
{X} // khớp chính xác X lần
{X,} // khớp >= X lần
{X,Y} // khớp >= X và <= Y lần
Dưới đây là ví dụ về ba cú pháp khác nhau:
mẫu: [az]{11} 
chuỗi:   humuhumunuk unukuapua'a.
trận đấu: ^^ ^^^ ^^ ^^ ^^   
( Ví dụ )
mẫu: [az]{18,} 
chuỗi:   humuhumunukunukuapua 'a.
trận đấu: ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^    
( Ví dụ )
mẫu: [az]{11,18} 
chuỗi:   humuhumunukunukuap ua'a.
trận đấu: ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^    
( Ví dụ ) Có một số điểm cần lưu ý trong các ví dụ trên.ghi chú:. Đầu tiên, sử dụng ký hiệu {X}, ký tự hoặc nhóm trước đó sẽ khớp chính xác với số (X) lần đó. Nếu có nhiều ký tự trong "từ" (so với số X) có thể khớp với mẫu (như trong ví dụ đầu tiên), thì chúng sẽ không được đưa vào kết quả khớp. Nếu số lượng ký tự nhỏ hơn X thì việc so khớp đầy đủ sẽ không thành công (hãy thử thay đổi 11 thành 99 trong ví dụ đầu tiên). Thứ hai, các ký hiệu {X,} và {X,Y} là tham lam. Họ sẽ cố gắng ghép càng nhiều ký tự càng tốt trong khi vẫn đáp ứng được biểu thức chính quy đã cho. Nếu bạn chỉ định {3,7} thì có thể khớp 3 đến 7 ký tự và nếu 7 ký tự tiếp theo hợp lệ thì tất cả 7 ký tự sẽ khớp. Nếu bạn chỉ định {1,} và tất cả 14.000 ký tự tiếp theo đều khớp thì tất cả 14.000 ký tự đó sẽ được bao gồm trong chuỗi tương ứng. Làm cách nào chúng ta có thể sử dụng kiến ​​thức này để viết lại biểu thức trên? Cải tiến đơn giản nhất có thể là thay thế các nhóm lân cận [a-z]bằng [a-z]{N}, trong đó N được chọn tương ứng:
mẫu: ([AZ][az]{2feraz]+)|([AZ][az]?[az]?)  
...nhưng điều đó không làm mọi việc tốt hơn nhiều. Nhìn vào nhóm chụp đầu tiên: chúng ta có [a-z]{2}(khớp chính xác 2 chữ cái viết thường) theo sau là [a-z]+(khớp với 1 hoặc nhiều chữ cái viết thường). Chúng ta có thể đơn giản hóa việc này bằng cách yêu cầu 3 chữ cái viết thường trở lên sử dụng dấu ngoặc nhọn:
mẫu: ([AZ][az]{3,})|([AZ][az]?[az]?) 
Nhóm chụp thứ hai thì khác. Chúng tôi cần không quá ba ký tự trong những họ này, có nghĩa là chúng tôi có giới hạn trên nhưng giới hạn dưới của chúng tôi bằng 0:
mẫu: ([AZ][az]{3,})|([AZ][az]{0,2}) 
Tính đặc hiệu luôn tốt hơn khi sử dụng biểu thức chính quy, vì vậy sẽ là khôn ngoan nếu dừng lại ở đó, nhưng tôi không thể không nhận thấy rằng hai phạm vi ký tự ( [AZ][az]) cạnh nhau này trông gần giống như một lớp "ký tự từ", \w( [A-Za-z0-9_]) . Nếu chúng tôi tự tin rằng dữ liệu của mình chỉ chứa họ được định dạng đúng, thì chúng tôi có thể đơn giản hóa biểu thức chính quy và viết đơn giản:
mẫu: (\w{4,})|(\w{1,3}) 
Nhóm đầu tiên ghi lại bất kỳ chuỗi nào gồm 4 "ký tự từ" trở lên ( [A-Za-z0-9_]) và nhóm thứ hai ghi lại bất kỳ chuỗi nào từ 1 đến 3 "ký tự từ" (đã bao gồm). Điều này sẽ làm việc?
mẫu: (\w{4,})|(\w{1,3}) 
chuỗi:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    222 1111 22 11111 1111 222 1111    
( Ví dụ ) Nó đã hoạt động! Làm thế nào về cách tiếp cận này? Và nó sạch hơn nhiều so với ví dụ trước của chúng tôi. Vì nhóm bắt giữ đầu tiên khớp với tất cả các họ có bốn ký tự trở lên, chúng tôi thậm chí có thể thay đổi nhóm bắt giữ thứ hai thành đơn giản \w+, vì điều này sẽ cho phép chúng tôi nắm bắt tất cả các họ còn lại (có 1, 2 hoặc 3 ký tự):
mẫu: (\w{4,})|(\w+) 
string:   Kim Jobs Xu Cloyd Mohr Ngo Rock .
trận đấu: ^^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    222 1111 22 11111 1111 222 1111    
( Ví dụ )

Hãy cùng bộ não tìm hiểu điều này và giải quyết 2 vấn đề sau nhé:

Sử dụng dấu ngoặc nhọn {}để viết lại biểu thức chính quy tra cứu số an sinh xã hội từ bước 7:
mẫu:
chuỗi: 113-25=1902 182-82-0192 H23-_3-9982 1I1-O0-E38B
trận đấu:              ^^ ^^^ ^^ ^^ ^^
( Giải pháp ) Giả sử rằng trình kiểm tra độ mạnh mật khẩu của trang web yêu cầu mật khẩu người dùng phải có từ 6 đến 12 ký tự. Viết biểu thức chính quy đánh dấu các mật khẩu không hợp lệ trong danh sách bên dưới. Mỗi mật khẩu được chứa trong dấu ngoặc đơn ()để dễ dàng so khớp, vì vậy hãy đảm bảo biểu thức chính quy bắt đầu và kết thúc bằng các ký tự chữ ()ký hiệu. Gợi ý: đảm bảo bạn không cho phép sử dụng dấu ngoặc đơn trong mật khẩu bằng [^()]hoặc tương tự, nếu không bạn sẽ phải khớp toàn bộ chuỗi!
mẫu:
chuỗi:   (12345) (mật khẩu của tôi) (Xanadu.2112) (su_do) (OfSalesmen!)
trận đấu: ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^  
( Giải pháp )

Bước 14: \bBiểu tượng đường viền có chiều rộng bằng 0

20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 5Nhiệm vụ cuối cùng khá khó khăn. Nhưng điều gì sẽ xảy ra nếu chúng ta làm cho nó phức tạp hơn một chút bằng cách đặt mật khẩu trong dấu ngoặc kép ""thay vì dấu ngoặc đơn ()? Chúng ta có thể viết một giải pháp tương tự bằng cách thay thế tất cả các ký tự dấu ngoặc đơn bằng các ký tự trích dẫn không?
mẫu: \"[^"]{0.5}\"|\"[^"]+\s[^"]*\" 
chuỗi:   "12345" "mật khẩu của tôi" "Xanadu.2112 " " su_do" " OfSalesmen! "
trận đấu: ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^  
( Ví dụ ) Nó không diễn ra ấn tượng lắm. Bạn đã đoán được tại sao chưa? Vấn đề là chúng tôi đang tìm kiếm mật khẩu không chính xác ở đây. "Xanadu.2112" là một mật khẩu tốt, vì vậy khi biểu thức chính quy nhận ra rằng chuỗi này không chứa dấu cách hoặc ký tự bằng chữ ", nó sẽ xuất hiện ngay trước ký tự "đủ điều kiện cho mật khẩu ở bên phải. (Bởi vì chúng tôi đã chỉ định rằng "không thể tìm thấy các ký tự bên trong mật khẩu bằng cách sử dụng [^"].) Khi công cụ biểu thức chính quy hài lòng rằng các ký tự đó không khớp với một biểu thức chính quy cụ thể, nó sẽ chạy lại, chính xác ở nơi nó đã dừng lại - vị trí của ký tự ". điều này giới hạn " Xanadu.2112" ở bên phải. Từ đó anh ta nhìn thấy một ký tự khoảng trắng và một ký tự khác "- đối với anh ta đây là mật khẩu sai! Về cơ bản, anh ấy tìm thấy trình tự này " "và tiếp tục. Đây hoàn toàn không phải là những gì chúng tôi muốn nhận được... Sẽ thật tuyệt nếu chúng tôi có thể chỉ định rằng ký tự đầu tiên của mật khẩu không được khoảng trắng. Có cách nào để làm việc này không? (Đến giờ, có lẽ bạn đã nhận ra rằng câu trả lời cho tất cả các câu hỏi tu từ của tôi là "có.") Đúng vậy! Có một cách như vậy! Nhiều công cụ biểu thức chính quy cung cấp một chuỗi thoát, chẳng hạn như "ranh giới từ" \b. "Ranh giới từ" \blà một chuỗi thoát có độ rộng bằng 0, thật kỳ lạ, khớp với ranh giới từ. Hãy nhớ rằng khi chúng tôi nói "từ", chúng tôi muốn nói đến bất kỳ chuỗi ký tự nào trong lớp \whoặc [A-Za-z0-9_]. So khớp ranh giới từ có nghĩa là ký tự ngay trước hoặc ngay sau chuỗi \bphải là неký tự từ. Tuy nhiên, khi khớp, chúng tôi không đưa ký tự này vào chuỗi con đã bắt được. Đây là chiều rộng bằng không. Để xem cách thức hoạt động của nó, hãy xem một ví dụ nhỏ:
mẫu: \b[^ ]+\b 
chuỗi:   Đã vẫn vant ze money , Lebowski .
trận đấu: ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^ ^^ ^^ ^^  
( Ví dụ ) Chuỗi [^ ]phải khớp với bất kỳ ký tự nào không phải là ký tự khoảng trắng. Vậy tại sao điều này không khớp với dấu phẩy ,sau tiền hoặc dấu chấm " .sau Lebowski? Điều này là do dấu phẩy ,và dấu chấm .không phải là ký tự từ, do đó ranh giới được tạo ra giữa các ký tự từ và ký tự không phải từ. Chúng xuất hiện ở giữa yphần cuối của ký tự từ. từ money và dấu phẩy ,theo sau nó. và giữa " itừ Lebowski và dấu chấm .(dấu chấm/dấu chấm) theo sau nó. Biểu thức chính quy khớp với ranh giới của những từ này (nhưng không khớp với các ký tự không phải từ chỉ giúp xác định chúng). Nhưng điều gì sẽ xảy ra nếu chúng ta không đưa tính nhất quán \bvào mẫu của mình?
mẫu: [^ ]+ 
chuỗi:   Đã vẫn vant ze money, Lebowski. 
trận đấu: ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^  
( Ví dụ ) Vâng, bây giờ chúng ta cũng tìm thấy những dấu chấm câu này. Bây giờ, hãy sử dụng ranh giới từ để sửa biểu thức chính quy cho mật khẩu được trích dẫn:
mẫu: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\" 
chuỗi:   "12345" "mật khẩu của tôi" " Xanadu. 2112" "su_do" "Của nhân viên bán hàng!"
trận đấu: ^^ ^^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^  
( Ví dụ ) Bằng cách đặt ranh giới từ bên trong dấu ngoặc kép ("\b ... \b"), chúng tôi đang nói một cách hiệu quả rằng ký tự đầu tiên và cuối cùng của mật khẩu trùng khớp phải là "ký tự từ". Vì vậy, điều này hoạt động tốt ở đây, nhưng sẽ không hoạt động tốt nếu ký tự đầu tiên hoặc cuối cùng trong mật khẩu của người dùng không phải là ký tự Word:
mẫu: \"\b[^"]{0.5}\b\"|\"\b[^"]+\s[^"]*\b\"
chuỗi: "thefollowingpasswordistooshort" "C++"
diêm:   
( Ví dụ ) Xem cách mật khẩu thứ hai không bị đánh dấu là "không hợp lệ" mặc dù rõ ràng là nó quá ngắn. bạn phảicẩn thậnbằng các chuỗi \b, vì chúng chỉ khớp với ranh giới giữa các ký tự \wchứ không phải \w. Trong ví dụ trên, vì chúng tôi cho phép các ký tự không phải , nên trong mật khẩu \w, ranh giới giữa \và ký tự đầu tiên/cuối cùng của mật khẩu không được đảm bảo là ranh giới từ \b.

Để hoàn thành bước này, chúng ta sẽ chỉ giải quyết một vấn đề đơn giản:

Ranh giới từ rất hữu ích trong công cụ đánh dấu cú pháp khi chúng ta muốn khớp một chuỗi ký tự cụ thể nhưng muốn đảm bảo rằng chúng chỉ xuất hiện ở đầu hoặc cuối một từ (hoặc ở riêng chúng). Giả sử chúng ta đang viết tô sáng cú pháp và muốn làm nổi bật từ var, nhưng chỉ khi nó tự xuất hiện (không chạm vào các ký tự khác trong từ). Bạn có thể viết một biểu thức chính quy cho điều này? Tất nhiên là bạn có thể, đó là một nhiệm vụ rất đơn giản;)
mẫu:
chuỗi:   var varx _var ( var j) barvarcar * var var -> { var }
trận đấu: ^^^ ^^^ ^^^ ^^^ ^^^  
( Giải pháp )

Bước 15: "dấu mũ" ^là "đầu dòng" và ký hiệu đô la $là "cuối dòng"

20 bước ngắn để thành thạo các biểu thức chính quy.  Phần 3 - 6Chuỗi ranh giới từ \b(từ bước cuối cùng của phần trước của bài viết) không phải là chuỗi có độ rộng bằng 0 đặc biệt duy nhất có sẵn để sử dụng trong các biểu thức chính quy. Hai cái phổ biến nhất là "dấu mũ" ^- "đầu dòng" và ký hiệu đô la $- "cuối dòng". Việc bao gồm một trong các biểu thức này trong biểu thức chính quy của bạn có nghĩa là kết quả khớp phải xuất hiện ở đầu hoặc cuối chuỗi nguồn:
mẫu: ^start|end$ 
chuỗi:   bắt đầu kết thúc bắt đầu kết thúc bắt đầu kết thúc bắt đầu kết thúc 
khớp: ^^^^ ^^^  
( Ví dụ ) Nếu chuỗi của bạn chứa các ngắt dòng, nó ^startsẽ khớp với chuỗi "bắt đầu" ở đầu bất kỳ dòng nào và end$sẽ khớp với chuỗi "kết thúc" ở cuối bất kỳ dòng nào (mặc dù điều này rất khó hiển thị ở đây). Những ký hiệu này đặc biệt hữu ích khi làm việc với dữ liệu có chứa dấu phân cách. Hãy quay lại vấn đề "kích thước tệp" ở bước 9 bằng cách sử dụng ^"đầu dòng". Trong ví dụ này, kích thước tệp của chúng tôi được phân tách bằng dấu cách " ". Vì vậy, chúng tôi muốn mỗi kích thước tệp bắt đầu bằng một số, trước ký tự khoảng trắng hoặc bắt đầu một dòng:
mẫu: (^| )(\d+|\d+\.\d+)[KMGT]B 
chuỗi:   6.6KB 1..3KB 12KB 5G 3.3MB KB .6.2TB 9MB .
trận đấu: ^^^^ ^^ ^^^ ^^ ^^ ^^ ^^ ^^ 
nhóm:    222 122 1222 12    
( Ví dụ ) Chúng ta đã đến rất gần mục tiêu rồi! Nhưng bạn có thể nhận thấy rằng chúng tôi vẫn còn một vấn đề nhỏ: chúng tôi khớp ký tự khoảng trắng trước kích thước tệp hợp lệ. Bây giờ chúng ta có thể chỉ cần bỏ qua nhóm thu thập này (1) khi công cụ biểu thức chính quy của chúng ta tìm thấy nó hoặc chúng ta có thể sử dụng nhóm không thu giữ mà chúng ta sẽ thấy trong bước tiếp theo.

Trong lúc chờ đợi, hãy giải quyết thêm 2 vấn đề nữa về âm thanh:

Tiếp tục với ví dụ đánh dấu cú pháp của chúng tôi ở bước trước, một số đánh dấu cú pháp sẽ đánh dấu dấu cách ở cuối, nghĩa là bất kỳ khoảng trắng nào nằm giữa ký tự không phải khoảng trắng và cuối dòng. Bạn có thể viết một biểu thức chính quy để chỉ đánh dấu các dấu cách ở cuối không?
mẫu:
chuỗi: myvec <- c(1, 2, 3, 4, 5)  
trận đấu:                          ^^ ^^^ ^^  
( Giải pháp ) Trình phân tích cú pháp giá trị được phân tách bằng dấu phẩy (CSV) đơn giản sẽ tìm kiếm các "mã thông báo" được phân tách bằng dấu phẩy. Nói chung, khoảng trắng không có ý nghĩa trừ khi nó được đặt trong dấu ngoặc kép "". Viết một biểu thức chính quy phân tích cú pháp CSV đơn giản khớp với các mã thông báo giữa các dấu phẩy nhưng bỏ qua (không ghi lại) khoảng trắng không nằm giữa các dấu ngoặc kép.
mẫu:
chuỗi:   a, "b", "c d",e,f, "g h", dfgi,, k, "", l 
khớp với: ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^^ ^^^ ^^ ^^ ^^ ^^ ^^^ ^ 
nhóm:    21 2221 2222212121 222221 222211 21 221 2    
( Giải pháp ) RegEx: 20 bước ngắn để thành thạo các 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