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

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

2 Likes

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 :smile:

3 Likes

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

1 Like

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.

5 Likes

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

1 Like

Ở đâ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. :slight_smile: Down vài cuốn ebook bài tập về

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á

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

  1. Ghi chuỗi cần phân tích ra
    Vd: [email protected]
  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ô :smiley: 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 :smiley:

7 Likes

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ỉ

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
3 Likes

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

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ều đoạn Regular Expressions dài nên đôi khi lười toàn gg thôi

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

1 Like

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

3 Likes

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

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.

3 Likes

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

2 Likes

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 đó.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?