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
Bài liên quan
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
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
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
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.
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
Ở đâ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ề
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:
Vd:
4nhy3uemNhieulAm@yAhOo.com.vn
(4nhy3uemNhieulAm)@(yAhOo).(cOM).(vN)
Vậy ta thấy có 4 nhóm
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]+
[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
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à
…
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
validation bên thứ 3 cũng dùng regular expression thì sao bạn
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
Nguyên cái này làm cái luận văn thạc sỹ được đấy chú
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.
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
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 đó.
Regular Expression và Context Free Grammar của SQL.
[spoiler]Ps: đào mộ[/spoiler]