Regex Tanpa Ujian Meminta Masalah - Jangan malas. Ia percuma dengan AI!
TL;DR: Gunakan ungkapan biasa yang jelas dan ringkas, dan ujinya dengan teliti.
Ekspresi biasa berkuasa tetapi rumit.
Jika anda menulis regex tanpa ujian, anda meminta ralat yang tidak dijangka.
Jika anda menulis regex samar dan melangkau ujian automatik, anda boleh terlepas kes penting, menyebabkan isu keselamatan atau kekecewaan pengguna.
public class PasswordValidator { public static boolean isValidPassword(String password) { return password.matches( "^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$"); // This is a cryptic Regular Expression } }
import java.util.ArrayList; import java.util.List; public class PasswordValidator { public static List<String> validatePassword(String password) { List<String> errors = new ArrayList<>(); if (password.length() < 8) { errors.add( "Password must be at least 8 characters long."); } if (!password.matches(".*[A-Z].*")) { errors.add( "Password must contain at least one uppercase letter."); } if (!password.matches(".*[a-z].*")) { errors.add( "Password must contain at least one lowercase letter."); } if (!password.matches(".*\d.*")) { errors.add( "Password must contain at least one digit."); } if (errors.isEmpty()) { errors.add( "Password is valid."); } return errors; // You no longer need a Regular Expression!! } } import static org.junit.Assert.*; import org.junit.Test; public class PasswordValidatorTest { // Now you have a lot of tests // You can use a Regular Expression, // a String Validator // an External Library // Whatever you want as long as it passes the tests! @Test public void testValidPassword() { List<String> result = PasswordValidator.validatePassword( "StrongPass1"); assertEquals("Password is valid.", result.get(0)); } @Test public void testTooShortPassword() { List<String> result = PasswordValidator.validatePassword( "Short1"); assertTrue(result.contains( "Password must be at least 8 characters long.")); } @Test public void testNoUppercase() { List<String> result = PasswordValidator.validatePassword( "nouppercase1"); assertTrue( result.contains( "Password must contain at least one uppercase letter.")); } @Test public void testNoLowercase() { List<String> result = PasswordValidator.validatePassword( "NOLOWERCASE1"); assertTrue(result.contains( "Password must contain at least one lowercase letter.")); } @Test public void testNoNumber() { List<String> result = PasswordValidator.validatePassword( "NoNumberPass"); assertTrue(result.contains( "Password must contain at least one digit.")); } }
[X] Automatik
Anda boleh mengesan apabila regex anda ditemui dengan menukarnya kepada gagal dan menjalankan semua ujian anda.
Jika pengesahan anda mengembalikan "palsu" tanpa penjelasan yang mesra pengguna, ini adalah petanda yang jelas anda perlu memfaktorkannya semula dan menambah baik maklum balas.
[X] Pemula
AI boleh menjana ungkapan biasa tetapi selalunya gagal memberikan mesej ralat yang berguna.
Tanpa arahan yang betul, pengesah yang dijana AI mungkin gagal membimbing pengguna untuk membetulkan input mereka.
AI boleh mengesan corak ungkapan biasa asas dan tiada maklum balas dengan gesaan yang jelas.
ia mungkin tidak membuat kes ujian terperinci atau penerangan secara automatik melainkan ditanya secara khusus.
Ingat: AI Assistants melakukan banyak kesilapan
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
Ungkapan biasa tanpa maklum balas yang jelas adalah tidak mesra pengguna dan terdedah kepada ralat.
Adalah membantu jika anda menerangkan sebab mereka gagal dan menulis ujian menyeluruh untuk memastikan regex anda berfungsi seperti yang diharapkan.
Bau Kod adalah pendapat saya.
Foto oleh rc.xyz NFT galeri pada Unsplash
Maklum balas adalah sarapan pagi juara.
Ken Blanchard
Artikel ini adalah sebahagian daripada Siri CodeSmell.
Atas ialah kandungan terperinci Bau Kod - Ungkapan Biasa Yang Belum Diuji. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!