01/10/2018, 10:46

Các nguyên tắc thiết kế một Regular Expressions

chào mọi người mình đang thấy gặp vài khó khăn khi thiết kễ một Regular Expressions .mọi người có thể chia sẻ những kinh nghiệm để thiết kế chuỗi này một cách tốt nhất không thân ái và quyết thắng

Trang Xinh viết 12:56 ngày 01/10/2018

Bạn không nói rõ khó khăn gì thì ai giúp bạn giải quyết được :))).
Nguyên tắc cơ bản để làm bất cứ việc gì là: bắt đầu từ những cái ĐƠN GIẢN

chichi viết 13:02 ngày 01/10/2018

Nguyên tắc là bắt đầu từ những cái đơn giản, cái gì khó quá google có hết

HelloWorld viết 12:54 ngày 01/10/2018

bạn học môn ngôn ngữ hình thức à?
thiết kế DFA hoặc NFA rồi chuyển sáng RE dễ hơn là làm trực tiếp RE

Hung viết 12:53 ngày 01/10/2018

Khó khăn của RE ở 2 thứ: phức tạp, hard code

Phức tạp của RE do cố gắng nhét tất cả luật vào 1 biểu thức. Ví dụ kiểm tra email gồm nhiều luật: kí tự hợp lệ, kí tự trước @, kí tự sau @. Mỗi luật có một số RE khác nhau. Rồi kết hợp tất cả RE đó vào 1 RE chung. Do đó RE cuối cùng bao gồm quá nhiều luật, làm cho RE khó đọc.

Hardcode: RE là 1 chuỗi, gần giống như 1 kiểu dữ liệu riêng, kiểu RE không có thuộc tính để xem xét, cũng như không có các phương thức để chỉnh sửa. Khi mà tập luật của RE thay đổi là xác định ăn hành.

Nguyên tắc thiết kế của mình là tránh dùng RE, và sử dụng thư viện Validation của bên thứ 3 cho tiện. Trường hợp app đặc thù cần phải build 1 RE riêng thì mình cũng tạo các class đại diện cho 1 luật (rule), có thể dùng code hoặc RE thực hiện luật. Sau đó dùng Design Pattern như Chain of Responsibility và Compose Pattern để ghép nối các luật với nhau. Sau này cần thay đổi luật nào mình chỉ cần tìm class đại diện luật đó, class đó có luật con nào không? Yêu cầu thay đổi liên quan luật con nào thì lại mò vào class con tương ứng với luật con.

Đỗ Nhiên viết 12:52 ngày 01/10/2018

mình ko bạn à chỉ tại mình mà dùng cái món này thì toàn gg tìm chuỗi thôi chứ mình ko tự viết và thiết kế được mấy

Henry viết 12:54 ngày 01/10/2018

Ở đây cũng không ai gọi là chuyên gia về Regex cả nên cũng khó cho bạn một cái nguyên tắc trong khi vốn nó đã phức tạp rồi. Nói chung là luyện thôi. Down vài cuốn ebook bài tập về

Noname viết 12:58 ngày 01/10/2018

Bạn nói cho mình rõ hơn cái Design Patter như: Chain of Responsibility, Compose Pattern được không. Có thể cho cái demo ví dụ thì tốt quá

*grab popcorn* viết 12:58 ngày 01/10/2018

Mình thường làm ntn:

  1. Ghi chuỗi cần phân tích ra
    Vd: 4nhy3uemNhieulAm@yAhOo.com.vn
  2. Tách ra những chỗ nào gom lại trong ngoặc [] được
    (4nhy3uemNhieulAm)@(yAhOo).(cOM).(vN)
    Vậy ta thấy có 4 nhóm
  3. Phân tích từng nhóm xem gộp lại thành gì được
    Như nhóm 1 có hoa thường và số và nhiều hơn 1 ký tự -> [a-zA-Z0-9]+
    Nhóm 2, 3, 4 chỉ có hoa thường -> [a-zA-Z]+
    => [a-zA-Z0-9]+@[a-zA-Z]+\.[a-zA-Z]+\.[a-zA-Z]+
  4. Xem cái nào là tùy chọn thì group lại và t hêm dấu ? Như nhóm 4 thường domain ko tới nên mình có thể gom lại thành
    [a-zA-Z0-9]+@[a-zA-Z]+\.[a-zA-Z]+(\.[a-zA-Z]+)?

Thế là nhờ 4 bc trên, mình làm đươcj một pattern dạng thô Tới bước này thì bạn có thể xem các pattern nào trùng lặp có thể gom lại nhỏ nữa. Như mình thấy nhóm 3 và 4 giống giống nhau nên gom lại thành
[a-zA-Z0-9]+@[a-zA-Z]+(\.[a-zA-Z]+){1, 2}
Sau đó áp dụng các ký hiệu regex của ngôn ngữ để ngắn gọn hơn
Vd \s = a-zA-Z, \d = 0-9, \w = a-zA-Z0-9

=> [\w]+@[\s]+(\.[\s]+){1, 2}

Như thế là xong

Noname viết 12:54 ngày 01/10/2018

Cuối cùng đặt trong r’/…/’ và thêm các cờ tủy chọn nữa , như lấy từng dòng, lấy kết quả đầu tiên, lấy hết… phải ko nhỉ

Dark.Hades viết 12:48 ngày 01/10/2018

Mình ưu tiên là

  1. Xem ngôn ngữ có hỗ trợ sẵn hàm validate đó chưa
  2. Xem thư viện
  3. Xem code mà ai đó từng xây dựng

    cuối cùng mới tự build, vì tự build lúc nào cũng sẽ tiềm ẩn lỗi không đoán trước được, nếu là để luyện hoặc chắc chắn về khả năng của bản thân thì khuyến khích tự viết
Nguyễn Tuấn Anh viết 12:50 ngày 01/10/2018

validation bên thứ 3 cũng dùng regular expression thì sao bạn

Đào An viết 12:57 ngày 01/10/2018

chọn thư viện có nhiều star trên github thì vẫn yên tâm hơn 1 mình tự build :

Đỗ Nhiên viết 12:57 ngày 01/10/2018

nhiều đoạn Regular Expressions dài nên đôi khi lười toàn gg thôi

*grab popcorn* viết 12:52 ngày 01/10/2018

3 posts were split to a new topic: Kiểm tra phương trình hóa học bằng Regular Expression

Nguyen Ca viết 12:48 ngày 01/10/2018

Nguyên cái này làm cái luận văn thạc sỹ được đấy chú

Đỗ Nhiên viết 12:49 ngày 01/10/2018

bác có tính học thạc sỹ ko bác

Hung viết 12:53 ngày 01/10/2018

Quy tắc có rồi mà bác, trong môn Toán rời rạc, Trình biên dịch hoặc Automata và ngôn ngữ hình thức. Đầy đủ định nghĩa, định lý và giải thuật. Ngoài Regular Expression ra còn có Context Free Grammar (CFG) và Turing Machine nữa.

Nếu có luận văn thạc sĩ thì có phân tích từ trong đoạn văn tiếng Việt (từ đơn, từ ghép), đề này phải dùng CFG mở rộng (gắn thêm ngữ nghĩa), còn RE không đủ mạnh để phân tích.

Nguyen Ca viết 12:52 ngày 01/10/2018

Không chú ơi, mà công nhân nhiêu đưa siêng thật đặc biệt là con gái, quen mấy đứa học lên thạc sỹ(IT) rồi

Triet viết 13:01 ngày 01/10/2018

Nghĩ đến nhu cầu mình cần dùng RegEx, sau đó viết ra câu RegEx dựa trên nhu cầu đó.

Hung viết 12:48 ngày 01/10/2018

Regular Expression và Context Free Grammar của SQL.

[spoiler]Ps: đào mộ[/spoiler]

Bài liên quan
0