没有测试的正则表达式是自找麻烦 - 不要偷懒。它是免费的人工智能!
TL;DR:使用清晰简洁的正则表达式,并彻底测试它们。
正则表达式很强大,但也很棘手。
如果您在没有测试的情况下编写正则表达式,则会出现意外错误。
如果您编写神秘的正则表达式并跳过自动化测试,您可能会错过重要的案例,从而导致安全问题或用户沮丧。
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] 自动
您可以通过将正则表达式更改为失败并运行所有测试来检测它何时被发现。
如果您的验证返回“false”而没有用户友好的解释,则明确表明您需要重构它并改进反馈。
[X] 初学者
人工智能可以生成正则表达式,但通常无法提供有用的错误消息。
如果没有适当的说明,人工智能生成的验证器可能无法指导用户修复他们的输入。
人工智能可以检测基本的正则表达式模式和缺失的反馈,并提供清晰的提示。
除非特别要求,否则它可能不会自动创建详细的测试用例或描述。
记住:人工智能助手会犯很多错误
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
没有明确反馈的正则表达式对用户不友好并且容易出错。
如果您描述了它们失败的原因并编写了彻底的测试以确保您的正则表达式按预期工作,这将会有所帮助。
代码味道是我的观点。
照片由 Unsplash 上的 rc.xyz NFT 画廊拍摄
反馈是冠军的早餐。
肯·布兰查德
本文是 CodeSmell 系列的一部分。
以上是代码异味 - 未经测试的正则表达式的详细内容。更多信息请关注PHP中文网其他相关文章!