Trang chủ » làm thế nào để » Cách sử dụng các biểu thức chính quy cơ bản để tìm kiếm tốt hơn và tiết kiệm thời gian

    Cách sử dụng các biểu thức chính quy cơ bản để tìm kiếm tốt hơn và tiết kiệm thời gian

    Cho dù bạn đã tìm kiếm với Grep hay xem các chương trình có thể đổi tên các tệp cho bạn, có lẽ bạn đã tự hỏi liệu có cách nào dễ dàng hơn để hoàn thành công việc của mình không. Rất may, có, và nó được gọi là biểu thức chính quy.

    (Truyện tranh từ XKCD.com)

    Biểu thức chính quy là gì?

    Biểu thức chính quy là các câu lệnh được định dạng theo một cách rất cụ thể và có thể đại diện cho nhiều kết quả khác nhau. Còn được gọi là regex, hay regex, và chúng được sử dụng chủ yếu trong các chức năng đặt tên tệp và tìm kiếm. Một regex có thể được sử dụng như một công thức để tạo ra một số kết quả đầu ra khác nhau, tất cả đều được tìm kiếm. Ngoài ra, bạn có thể chỉ định cách đặt tên cho một nhóm tệp bằng cách chỉ định biểu thức chính quy và phần mềm của bạn có thể tăng dần đến đầu ra dự định tiếp theo. Bằng cách này, bạn có thể đổi tên nhiều tệp trong nhiều thư mục rất dễ dàng và hiệu quả và bạn có thể vượt ra khỏi giới hạn của một hệ thống đánh số đơn giản.

    Vì việc sử dụng các biểu thức chính quy dựa trên một cú pháp đặc biệt, chương trình của bạn phải có khả năng đọc và phân tích chúng. Nhiều chương trình đổi tên tệp hàng loạt cho Windows và OS X có hỗ trợ cho regexps, cũng như công cụ tìm kiếm đa nền tảng GREP (mà chúng tôi đã chạm vào trong Bash Scripting for Beginners Guide) và công cụ dòng lệnh Awk cho * Nix. Ngoài ra, nhiều trình quản lý tệp, trình khởi chạy và công cụ tìm kiếm thay thế sử dụng chúng và chúng có một vị trí rất quan trọng trong các ngôn ngữ lập trình như Perl và Ruby. Các môi trường phát triển khác như .NET, Java và Python, cũng như C ++ 11 sắp tới, tất cả đều cung cấp các thư viện chuẩn để sử dụng các biểu thức thông thường. Như bạn có thể tưởng tượng, chúng có thể thực sự hữu ích khi cố gắng giảm thiểu số lượng mã bạn đưa vào một chương trình.

    Lưu ý về việc thoát nhân vật

    Trước khi chúng tôi chỉ cho bạn các ví dụ, chúng tôi muốn chỉ ra điều gì đó. Chúng tôi sẽ sử dụng bash shell và lệnh grep để chỉ cho bạn cách áp dụng các biểu thức thông thường. Vấn đề là đôi khi chúng ta muốn sử dụng các ký tự đặc biệt cần được truyền cho grep và shell bash sẽ diễn giải ký tự đó vì shell cũng sử dụng nó. Trong những trường hợp này, chúng ta cần phải thoát khỏi những nhân vật này. Điều này có thể gây nhầm lẫn bởi vì các nhân vật này thoát khỏi các nhân vật khác cũng xuất hiện bên trong regexps. Ví dụ: nếu chúng ta muốn nhập cái này vào grep:

    \<

    chúng ta sẽ phải thay thế nó bằng:

    \<

    Mỗi ký tự đặc biệt ở đây được một dấu gạch chéo ngược. Ngoài ra, bạn cũng có thể sử dụng dấu ngoặc đơn:

    '\<'

    Trích dẫn duy nhất nói bash KHÔNG để giải thích những gì bên trong chúng. Mặc dù chúng tôi yêu cầu các bước này được thực hiện để chúng tôi có thể chứng minh cho bạn, nhưng các chương trình của bạn (đặc biệt là các chương trình dựa trên GUI) thường sẽ không yêu cầu các bước bổ sung này. Để giữ mọi thứ đơn giản và dễ hiểu, biểu thức chính quy thực tế sẽ được cung cấp cho bạn dưới dạng văn bản được trích dẫn và bạn sẽ thấy cú pháp thoát trong ảnh chụp màn hình dòng lệnh.

    Làm thế nào để họ mở rộng?

    Regexps là một cách thực sự ngắn gọn để nêu các thuật ngữ để máy tính của bạn có thể mở rộng chúng thành nhiều tùy chọn. Hãy xem ví dụ sau:

    tom [0123456789]

    Dấu ngoặc vuông - [và] - báo cho công cụ phân tích cú pháp rằng bất cứ thứ gì bên trong, bất kỳ MỘT ký tự nào cũng có thể được sử dụng để khớp. Bất cứ thứ gì bên trong các dấu ngoặc đó đều được gọi là bộ ký tự.

    Vì vậy, nếu chúng tôi có một danh sách lớn các mục và chúng tôi đã sử dụng biểu thức chính này để tìm kiếm, các thuật ngữ sau sẽ được khớp:

    • tom
    • ngày mai
    • tom1
    • tom2
    • tom3

    vân vân Tuy nhiên, danh sách sau đây sẽ KHÔNG được khớp và vì vậy sẽ KHÔNG hiển thị trong kết quả của bạn:

    • cà chua ; regex không chiếm bất kỳ chữ cái nào sau khi tom tom
    • Tom; regex là trường hợp nhạy cảm!

    Bạn cũng có thể chọn tìm kiếm với dấu chấm (.) Sẽ cho phép bất kỳ ký tự nào xuất hiện, miễn là có một ký tự.

    Như bạn có thể thấy, grepping với

    .tom

    đã không đưa ra các điều khoản mà chỉ có ngay tom tom. Ngay cả những quả cà chua màu xanh lá cây khác đã xuất hiện, bởi vì không gian trước khi tom tom Được tính là một nhân vật, nhưng các thuật ngữ như Hồi tomFật không có một nhân vật nào lúc đầu và do đó đã bị bỏ qua.

    Lưu ý: Hành vi mặc định của Grep là trả về toàn bộ dòng văn bản khi một số phần khớp với biểu thức chính quy của bạn. Các chương trình khác có thể không làm điều này và bạn có thể tắt nó trong grep với cờ '-o'.

    Bạn cũng có thể chỉ định luân phiên bằng cách sử dụng một đường ống (|), như ở đây:

    đặc biệt (s | z) e

    Điều này sẽ tìm thấy cả hai:

    • chuyên
    • chuyên

    Khi sử dụng lệnh grep, chúng ta cần thoát các ký tự đặc biệt (, | và) bằng dấu gạch chéo ngược cũng như sử dụng cờ '-E' để làm việc này và tránh các lỗi xấu.

    Như chúng tôi đã đề cập ở trên, điều này là do chúng tôi cần nói với bash shell để chuyển các ký tự này cho grep và không làm gì với chúng. Cờ '-E' cho grep sử dụng dấu ngoặc đơn và đường ống làm ký tự đặc biệt.

    Bạn có thể tìm kiếm bằng cách loại trừ bằng cách sử dụng dấu mũ nằm trong dấu ngoặc vuông và ở đầu tập hợp:

    tom [^ F | 0-9]

    Một lần nữa, nếu bạn đang sử dụng grep và bash, hãy nhớ thoát khỏi đường ống đó!

    Các điều khoản có trong danh sách nhưng KHÔNG hiển thị là:

    • ngày mai
    • tom5
    • ngày mai
    • TomF

    Chúng không phù hợp với regex của chúng tôi.

    Làm thế nào tôi có thể sử dụng môi trường?

    Thông thường, chúng tôi tìm kiếm dựa trên ranh giới. Đôi khi chúng ta chỉ muốn các chuỗi xuất hiện ở đầu một từ, ở cuối từ hoặc ở cuối dòng mã. Điều này có thể được thực hiện dễ dàng bằng cách sử dụng cái mà chúng ta gọi là neo.

    Sử dụng dấu mũ (bên ngoài dấu ngoặc) cho phép bạn chỉ định kiểu bắt đầu của một dòng.

    ^ tom

    Để tìm kiếm kết thúc của một dòng, sử dụng ký hiệu đô la.

    tom $

    Bạn có thể thấy rằng chuỗi tìm kiếm của chúng tôi xuất hiện TRƯỚC mỏ neo trong trường hợp này.

    Bạn cũng có thể cho các kết quả xuất hiện ở đầu hoặc cuối từ, không phải toàn bộ dòng.

    \

    tom \>

    Như chúng tôi đã đề cập trong phần ghi chú ở đầu bài viết này, chúng tôi cần phải thoát khỏi những ký tự đặc biệt này vì chúng tôi đang sử dụng bash. Ngoài ra, bạn cũng có thể sử dụng dấu ngoặc đơn:

    Kết quả là như nhau. Hãy chắc chắn rằng bạn sử dụng dấu ngoặc đơn và không phải dấu ngoặc kép.

    Tài nguyên khác cho Regexps nâng cao

    Chúng tôi chỉ chạm đỉnh của tảng băng ở đây. Bạn cũng có thể tìm kiếm các thuật ngữ tiền được mô tả bằng điểm đánh dấu tiền tệ và tìm kiếm bất kỳ ba thuật ngữ phù hợp nào trở lên. Mọi thứ có thể trở nên thực sự phức tạp. Nếu bạn quan tâm đến việc tìm hiểu thêm về các biểu thức thông thường, thì hãy xem các nguồn sau.

    • Zytrax.com có ​​một vài trang với các ví dụ cụ thể về lý do tại sao mọi thứ làm và không khớp.
    • Chính quy-Expressions.info cũng có một hướng dẫn giết người cho rất nhiều thứ nâng cao hơn, cũng như một trang tham khảo tiện dụng.
    • Gnu.org có một trang dành riêng cho việc sử dụng regexps với grep.

    Bạn cũng có thể xây dựng và kiểm tra các biểu thức thông thường của mình bằng công cụ trực tuyến dựa trên Flash miễn phí có tên RegExr. Nó hoạt động như bạn gõ, miễn phí và có thể được sử dụng trong hầu hết các trình duyệt.


    Bạn có sử dụng yêu thích cho các biểu thức thông thường? Biết về một renamer hàng loạt tuyệt vời sử dụng chúng? Có lẽ bạn chỉ muốn khoe khoang về grep-fu của bạn. Đóng góp suy nghĩ của bạn bằng cách bình luận!