Java は有限状態マシン アルゴリズムを使用して文字列が正当かどうかを判断します

質問の説明

指定された正規表現に基づいてメール形式が正当であるかどうかを確認してください。ユーザーが入力した形式が正当である場合は「メール形式は正当です」が出力され、そうでない場合は「メール形式が不正です」が出力されます。正しい形式「[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+」に対応する正規表現; 入力: 123123@
nowcoder
。 com
出力:
電子メール形式は正当です

分析する

一番思いつきやすいのは直接解くことができる正規表現ライブラリで、もちろん開発でも使われる手法です。
アルゴリズムのトピックとアルゴリズムの学習として、一般的に使用されるアルゴリズムである有限状態マシンを採用できます。
このアルゴリズムを使用すると、文字列が仕様に準拠しているかどうかを論理的かつ明確に判断できますが、コード量が多くなるという欠点があります。
しかし、論理的に正しいアルゴリズムを作成するのに役立つ良いアイデアであることは間違いありません。

アルゴリズムの背景

有限状態マシン (FSM) アルゴリズムは、一連の状態間のシステムの遷移を記述するために使用される数学モデルです。これは、一連の状態、入力イベント、および出力イベントで構成されます。FSM アルゴリズムの特徴は次のとおりです。

決定的: FSM アルゴリズムは、入力が与えられた場合に常に同じ順序で状態遷移を実行します。これは、FSM アルゴリズムが決定的であること、つまり、同じ入力に対して常に同じ出力を生成することを意味します。

方向: FSM アルゴリズムの各状態遷移には明確な方向があります。つまり、現在の状態から次の状態へのみ遷移できます。これにより、FSM アルゴリズムは無限ループの可能性を回避しながら、複雑な問題を効率的に処理できるようになります。

シンプルなストレージ: FSM アルゴリズムは現在の状態と一連の遷移ルール​​を保存するだけでよいため、ストレージ要件は比較的小さくなります。これにより、FSM アルゴリズムがリソースに制約のある状況に適したものになります。

拡張性: FSM アルゴリズムは、より複雑な問題を処理するために、新しい状態と遷移ルール​​を追加することで拡張できます。これにより、FSM アルゴリズムは非常にスケーラブルになります。

理解と実装が簡単: FSM アルゴリズムの構造はシンプルで、理解と実装が簡単です。このため、FSM アルゴリズムはさまざまな分野の問題解決に適しています。

有限状態マシン アルゴリズムによって解決される問題には次のものがあります。

シーケンス検出: FSM アルゴリズムは、文字列が有効な日付であるかどうかの検出、デジタル シーケンスが素数であるかどうかの検出など、シーケンスが特定の条件を満たすかどうかを検出するために使用できます。

パターン認識: FSM アルゴリズムを使用して、電子メール アドレスの識別、手書きの数字の認識など、テキスト、画像、またはその他のデータ内の特定のパターンを識別できます。

制御ロジック: FSM アルゴリズムを使用して、エレベーターの昇降制御、家庭用照明システム制御などの単純な制御ロジックを実装できます。

コンピュータ ハードウェア制御: FSM アルゴリズムを使用して、キーボード、マウス、その他の周辺機器などのコンピュータ ハードウェアを制御できます。

ゲーム AI: FSM アルゴリズムを使用して、ボード ゲーム、迷路ゲームなどの単純なゲーム AI を実装できます。

コード

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
    
    
    static boolean checkCharType(char c){
    
    
        if(c>='a'&&c<='z' || c>='A'&&c<='Z' || c>='0'&&c<='9'){
    
    
            return true;
        }else{
    
    
            return false;
        }
    }
    public static void main(String[] args) {
    
    

        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        String emailMatcher="[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+";

        // //write your code here......
        // Pattern pattern=Pattern.compile(emailMatcher);
        // if(pattern.matcher(str).matches()){
    
    
        //     System.out.println("邮箱格式合法");
        // }else{
    
    
        //     System.out.println("邮箱格式不合法");
        // }
        /*
        0:初始
        1:123123
        2:@
        3:nowcoder
        4: .
        5: com

        */
        int status=0;
        for(int i=0;i<str.length();++i){
    
    
            char c=str.charAt(i);
            if(status==0){
    
    
                if(checkCharType(c)){
    
    
                    status=1;
                }else{
    
    
                    break;
                }
            }else if(status==1){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else if(c=='@'){
    
    
                    status=2;
                }else{
    
    
                    break;
                }
            }else if(status==2){
    
    
                if(checkCharType(c)){
    
    
                    status=3;
                }else{
    
    
                    break;
                }
            }else if(status==3){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else if(c=='.'){
    
    
                    status=4;
                }else{
    
    
                    break;
                }
            }else if(status==4){
    
    
                if(checkCharType(c)){
    
    
                    status=5;
                }else{
    
    
                    break;
                }
            }else if(status==5){
    
    
                if(checkCharType(c)){
    
    
                    continue;
                }else{
    
    
                    status=-1;
                    break;
                }
            }
        }
        if(status==5){
    
    
            System.out.println("邮箱格式合法");
        }else{
    
    
            System.out.println("邮箱格式不合法");
        }

    }
}

おすすめ

転載: blog.csdn.net/artistkeepmonkey/article/details/132628883