コードの匂い - 未テストの正規表現
テストのない正規表現は問題を引き起こします - 怠惰にしないでください。 AI搭載で無料!
TL;DR: 明確で簡潔な正規表現を使用し、徹底的にテストしてください。
問題点
- 可読性
- テストケースはありません
- エッジケースの見逃し
- デバッグの課題
- 不明瞭な障害
- 隠れた欠陥
ソリューション
- お気に入りの AI にテスト ケースを作成してもらいます
- 複雑な正規表現をより小さく、読みやすい部分に分割します。
- エッジケースを確認してください
- 出力を検証する
- テストを作成したら正規表現をリファクタリングします
- エラーメッセージを改善する
コンテクスト
正規表現は強力ですが、注意が必要です。
テストを行わずに正規表現を作成すると、予期しないエラーが発生することになります。
不可解な正規表現を記述して自動テストをスキップすると、重要なケースを見逃して、セキュリティ上の問題やユーザーの不満を引き起こす可能性があります。
サンプルコード
間違っている
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] 初心者
AIの生成
AI は正規表現を生成できますが、役立つエラー メッセージを提供できないことがよくあります。
適切な指示がなければ、AI が生成したバリデーターはユーザーの入力を修正することができない可能性があります。
AI検出
AI は、明確なプロンプトにより、基本的な正規表現パターンと欠落しているフィードバックを検出できます。
特に要求されない限り、詳細なテスト ケースや説明が自動的に作成されない場合があります。
試してみてください!
覚えておいてください: AI アシスタントは多くの間違いを犯します
Without Proper Instructions | With Specific Instructions |
---|---|
ChatGPT | ChatGPT |
Claude | Claude |
Perplexity | Perplexity |
Copilot | Copilot |
Gemini | Gemini |
結論
明確なフィードバックのない正規表現はユーザーにとって使いにくく、エラーが発生しやすくなります。
失敗した理由を説明し、正規表現が期待どおりに動作することを確認するための徹底的なテストを作成していただければ助かります。
関係

コードの匂い 41 - 正規表現の乱用者
Maxi Contieri ・ 2020年12月3日

コードの匂い 185 - 悪質な正規表現
Maxi Contieri ・ 2022 年 12 月 8 日

コードの匂い 97 - 共感のないエラー メッセージ
マキシ・コンティエリ ・ 2021年10月27日
免責事項
コードの匂いは私の意見です。
クレジット
Unsplash の rc.xyz による写真
フィードバックはチャンピオンの朝食です。
ケン・ブランチャード

ソフトウェア エンジニアリングの素晴らしい名言
Maxi Contieri ・ 2020年12月28日
この記事は CodeSmell シリーズの一部です。

コードの怪しい部分を見つける方法
マキシ・コンティエリ ・ 2021年5月21日
以上がコードの匂い - 未テストの正規表現の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

intellijideaultimatiateバージョンを使用してスプリングを開始します...

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

Redisキャッシュソリューションは、製品ランキングリストの要件をどのように実現しますか?開発プロセス中に、多くの場合、ランキングの要件に対処する必要があります。
