1. 程式人生 > >用正則表示式簡單實現郵箱登陸註冊等功能

用正則表示式簡單實現郵箱登陸註冊等功能

前言

正則表示式(Regular Expression)作為在許多語言中都存在的邏輯表示式。被廣泛應用在檢索、替換等對文字進行操作的功能實現中。比起復雜的for迴圈和if的巢狀,正則表示式則更加簡潔高效,但是它的缺點也在這兒,由於過於符號化,正則表示式往往不夠直觀,如果對正則表示式的符號規則不太熟悉,那麼它往往成為了阻礙我們閱讀程式碼文字的絆腳石。這篇部落格通過簡單的實現一個郵箱類來談談如何去理解正則表示式,更來具體的展望它的實際應用。

分析

現在我們要寫一個簡單的郵箱(Email)類,要簡單實現郵箱的註冊(register)功能和登入(login)功能,其次為了體現完整性我們附加了退出

選項和檢視資料的功能。

我們來分析一下這個類說需要的屬性和方法:

屬性:
郵箱名:emailname;郵箱密碼:emailcode
方法:
註冊:registEmailName()&registEmailcode() 註冊郵箱方法和註冊郵箱密碼的方法
登入:loginEmail() 登入郵箱的方法
當然為了華麗點我們還做了一個操作介面:welCome()

這裡有人問了為什麼要將郵箱名和郵箱密碼註冊分開寫?如果只是簡單的實現那麼合起來分開倒是並無大礙,但是如果我們講究嚴謹的邏輯,那麼分開密碼的郵箱名是根據實際的情況講究的:因為我麼使用的郵箱一般名字的固定不變的,因為郵箱名存在唯一性。但是密碼往往會隨著情況而改變。所以在設計的初期考慮到這些功能我們就能在後面修改或者增刪時遊刃有餘。

閒話少說我們來進入程式碼的環節:

註冊方法的實現

在註冊方法實現前,我們先來討論郵箱名和密碼有什麼具體的特徵?
比如郵箱名,往往是以[email protected]或者.cn結尾的,而且@前後的兩個字串均以字母和數字以及下劃線組成,所以如果用IF和FOR來實現的話,往往需要臃腫的程式碼和嚴謹的邏輯。但是在正則表示式裡只需要限定相應的表示式便能完成對格式的約束。
到底有多簡單我們直接貼出它的表示式來分析“^[a-zA-Z1-9_]\[email protected]\w+.(com|cn)”
也許你看到這裡會覺得一頭霧水,這是些什麼東西?沒關係我們來慢慢分解它:首先看^[a-zA-Z1-9_]

表示了什麼?在正則表示式的開頭是用‘^’來表示限定開頭字元的範圍。[a-zA-Z1-9_]便是我們開頭第一個字元所要約束它的範圍。第一個字母總不能以0開頭的吧。我們接著分析,\w表示什麼呢,在正則表示式中\w匹配任何字類字元,包括下劃線。與”[A-Za-z0-9_]”等效。+表示一次或多次匹配前面的字元或子表示式。在Java的正則表示式中’\’需要使用轉義符來輸出,所以正則表示式為\\,因此我們實則在表示式要表示\w的時候需要加轉義符號成了\\w,這裡組合起來\w+就表示了@前首字母后的字串的約束,他們是在a-zA-Z0-9_ 中的字元。我麼直接使用@來匹配檢驗字元的@,這裡距離“hello world”的正則表示式其實就是匹配hello world的字串的,所以單字元亦然。綜上我們就能理解了後面\w和\.的含義了,那麼[com|cn]是什麼意思呢?正則表示式中‘|’將兩個匹配條件進行邏輯“或”(Or)運算:例如x|y匹配x或者y。所以這也限定了郵箱名後面域名的約束。
說了這麼多我們來看看註冊函式到底如何簡單的實現:

class Email {
    private static int i = 0;
    private static String emailname;
    private static String emailcode;

    private Email() {
    }
    ………………//郵箱類的主題
    public static void registEmailName() {//郵箱名的註冊方法
        registLine();
        System.out.println("請輸入郵箱帳號:");
        Scanner scanner = new Scanner(System.in);
        String stringEMN = scanner.nextLine();
        String regexEMN = "^[a-zA-Z1-9_]\\[email protected]\\w+\\.(com|cn)";//這裡是正則表示式的應用
        if (stringEMN.matches(regexEMN)) {
            Email.emailname = stringEMN;
            registEmailcode();
        } else {
            System.out.println("郵箱帳號格式不正確,請重新輸入!");
            registEmailName();
        }

    }

    private static void registEmailcode() {//郵箱密碼註冊方法
        Scanner scanner = new Scanner(System.in);
        System.out.println("請輸入1-8位郵箱密碼:");
        String stringPCode = scanner.nextLine();
        String regexPCode = "^[a-zA-Z1-9]\\w{1,8}";//這裡同樣給出了郵箱密碼的正則表示式
        if (stringPCode.matches(regexPCode)) {
            Email.emailcode = stringPCode;
            System.out.println("註冊成功!");
            DataBase.setEmailNameArray(i);//與後面輸出郵箱名密碼有關
            DataBase.setEmailCodeArray(i);
            i++;
        } else {
            System.out.println("密碼格式錯誤,請重新輸入!");
            registEmailcode();
        }
    }

從上面我們看出通過單條if判斷語句和正則表示式我們便實現了對郵箱名字和密碼的約束判斷。當不符合約束規則的時候返回false來重新呼叫註冊方法來實現正確格式的註冊。可以說正則表示式是一種簡單可行的具有強約束力的邏輯判斷表答式,我們來看下執行的結果:
register

登入方法的實現

在實現註冊方法後我們將從系統控制檯讀取的字串賦予了類的成員變數。然後我們呢就需要通過一個帶有判斷語句的登入方法來驗證資訊是否與註冊的相同:這裡用到了Scanner類來接受鍵盤的輸入。登入方法的實現依託著註冊方法的實現,我們在這裡簡單模擬了登入方法,但是在實際中我們所要寫的登入方法遠遠比這個實現起來千差萬別。因為登入資訊尤其是密碼是使用者的個人隱私,所以我們要考慮使用者輸入密碼時的加密性,還要考慮使用者密碼在輸入後的儲存安全問題。這裡我們先簡單的寫出我們的郵箱類登入方法。

 public static void loginEmail() { //登入方法
        loginLine();//在類中寫的分割線方法
        System.out.println("請輸入郵箱帳號:");
        Scanner scannerInput = new Scanner(System.in);
        String inputName = scannerInput.nextLine();//接收鍵盤輸入的郵箱名
        System.out.println("請輸入郵箱密碼:");
        String inputCode = scannerInput.nextLine();//接收鍵盤輸入的郵箱密碼
        if (emailname.equals(inputName)&&emailcode.equals(inputCode)) {
            System.out.println("登入成功!");
        } else {
            System.out.println("帳號或密碼錯誤,請重新登入!");
            loginEmail();
        }
    }

執行結果:
login

整體的完善

我們寫完登入方法和註冊方法後基本已經模擬了進入郵箱前的兩大基本功能。當然我目前在JavaSE的基礎學習階段,沒有完整學習Java中資料庫的相關操作和可視介面的建立。所以我們也在這裡使用方法來簡單模擬資料庫和介面的實現:

class Email {
    private static int i = 0;
    private static String emailname;
    private static String emailcode;
    public static String getEmailname() {//get基本方法
        return emailname;
    }

    public static String getEmailcode() {//get基本方法
        return emailcode;
    }

    public static void registLine() {//為了美觀而寫的分割線提示字串方法
        TesteMail.Line();
        System.out.println("歡迎註冊小白郵箱!");
        TesteMail.Line();
    }

    public static void loginLine() {//為了美觀而寫的分割線提示字串方法
        TesteMail.Line();
        System.out.println("歡迎登入小白郵箱!");
        TesteMail.Line();
    }

     public static void registEmailName() {……}//註冊郵箱名方法
     private static void registEmailcode() {……}//註冊郵箱密碼方法
     public static void loginEmail() {……}//登入方法

    public static void welCome() {//簡單模擬的操作介面
        TesteMail.Line();
        System.out.println("歡迎使用小白郵箱!");
        TesteMail.Line();
        System.out.println("請輸入對應數字執行功能:" + '\n' + "1.註冊郵箱" + '\n' + "2.登入郵箱" + '\n' + "3.退出" + '\n' + "4.檢視資料庫");
        TesteMail.Line();
        Scanner scannerWelcome = new Scanner(System.in);
        int flag = scannerWelcome.nextInt();//通過捕捉使用者的運算元來呼叫方法
        switch (flag) {
            case 1: {//註冊
                registEmailName();
                welCome();

                break;
            }
            case 2: {//登入
                loginEmail();
                welCome();
                break;
            }
            case 3: {//退出
                System.out.println("謝謝使用!");
                break;
            }
            case 4: {//檢視資料庫
                DataBase.printDateBace();
            }
            default: {//報錯
                System.out.println("輸入錯誤,重新輸入!");
                welCome();
            }
        }

    }
}

class DataBase {//模擬的資料庫類,用來存放輸入的資訊
    static String[] emailNameArray = new String[10];
    static String[] emailCodeArray = new String[10];

    public static void setEmailNameArray(int i) {//set基本方法
        DataBase.emailNameArray[i] = Email.getEmailname();
    }

    public static void setEmailCodeArray(int i) {//set基本方法
        DataBase.emailCodeArray[i] = Email.getEmailcode();
    }

    public static void printDateBace() {//列印方法,遍歷了String類的陣列
        TesteMail.Line();
        for (int i = 0; i < emailCodeArray.length - 1; i++) {
            System.out.println(emailNameArray[i] + "  " + emailCodeArray[i]);
        }
        TesteMail.Line();
    }
}

我們通過一個Switch的多項選擇來時間通過數字來呼叫相對應的功能,然後我們在註冊執行成功的時候呼叫資料庫的方法來將目前Email類中的資訊存入資料庫,然後通過PrintDataBase來檢視裡邊的資訊。這裡為了實現簡單,同一使用了靜態的方法和變數。其實在實際應用中我們的資訊大部分是動態而且不會存在本地的,這是用來保證使用者資訊的安全性所做的考慮。而且具體的儲存方式在學習資料庫後我們還會進行相關的完善。整體上這個類實現了對簡易郵箱的模擬實現,但是要讓它比肩實際應用,我能還需要更多的功能完善和安全性考慮,還要有後面整個郵件收發寫系統的整合!這是一個不斷學習和重新認識程式設計開發的過程,所謂心急吃不了熱豆腐,我們想要做出一個像樣的系統,紮實的基礎是不能忽略和必須踐行的準則。

這裡在附加執行結果的截圖:
datebace and welcome

關於正則表示式的深入

正則表示式的邏輯符號豐富,我們要記憶和熟練掌握它需要大量的閱讀和實踐。但是它來帶的效率提升也是直觀的。所以這裡提供了正則表示式的相關符號圖僅供大家參考,具體的操作還需要認真閱讀相關知識和勤奮的實際操作,所謂好記性不如爛筆頭,實踐出真知,實踐才是硬道理!

這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述
圖片來源於百度百科

寫在最後的小問題

喜歡探究和嚴謹的讀者或許會發現這個小程式中的不足和缺陷,這裡我也提出一些個人認為的不足:例如多次註冊後登入驗證的其實是沒用呼叫資料庫中說存的資訊進行判斷的,學而有餘的讀者我建議可以發揮自己的聰明才智來完善這個功能。還比如對密碼的修改、再者是登出功能的實現和登入成功後無法在繼續登入的問題等等…歡迎大家和我這個新手來探討交流。

相關推薦

表示式簡單實現郵箱登陸註冊功能

前言 正則表示式(Regular Expression)作為在許多語言中都存在的邏輯表示式。被廣泛應用在檢索、替換等對文字進行操作的功能實現中。比起復雜的for迴圈和if的巢狀,正則表示式則更加簡潔高效,但是它的缺點也在這兒,由於過於符號化,正則表示式往

PHP批量替換Img中src內容,表示式獲取圖片路徑實現縮圖功能

/** * 圖片地址替換成壓縮URL * @param string $content 內容 * @param string $suffix 字尾 */ function get_img_thumb_url($content="",$suffix="!c550x260.jpg") { // by

表示式實現 計算器

#!/usr/bin/env python # coding:utf-8 import re def dealwith(express): express.replace('+-','-') express.replace('--','+') return express d

python3 re模組,表示式方式實現簡單加減乘除計算器

import re #加法 def plus(s): if re.search("^\d+[.]?\d*\+\d+[.]?\d*",s) != None: str_re = re.search("\d+[.]?\d*\+\d+[.]?\d*", s).

3.7 python 中 表示式 郵箱及電話號碼的匹配

import re c = re.compile(r'^\[email protected](\w+\.)+(com|cn|net|edu)$') # string = ' [email protected]' string = '[email protected]'

Mssql中實現表示式更新欄位值

create   function   dbo.regexReplace     (     @source   varchar(5000),         --原字串     @regexp   varchar(1000),         --正則表示式     @replace   varch

手機號碼、郵箱匹配表示式java實現練手

概念:正則表示式就是用某種模式去匹配一類字串的一個公式。它由一些普通字元和一些元字元(metacharacters)組成。普通字元包括大小寫的字母和數字,而元字元則具有特殊的含義。 正則表示式的基礎語法為: “^([]{})([]{})([]{})$”。

實現表示式批量替換更新資料庫資料

select regexp_replace('e:/fs_root/images/host_21_wangyiblog/2009/11/30/14/00/2009113014000560.jpg','e:/fs_root/(.*?)/[^/.]*?.jpg','//1

Objective-C表示式判斷字串是否為手機號、郵箱、身份證號

用正則表示式判斷字串是否為手機號: - (BOOL)isPhoneNumber:(NSString *)str { NSString * MOBILE = @"^1(3[0-9]|5[0-

表達式匹配郵箱

a-z 字符 www. 郵箱 class 表達式 獲取 href text 正則表達式基礎請移步 正則表達式基礎。 下面講解在jsp中用正則表達式匹配郵箱的基本方法: 首相給出表達式: var regex = /^(?:\w+\.?)\[email protec

表達式實現 運算 express = '1 -2* ((60-30 +(-40/5) *(9-2*5/3 +7 /3*99 /4*2998 +10 *568 /14))-(-4*3)/(16-3*2))'

repl bsp val 實現 strip expr 運算 lac spl #!/usr/bin/env python # coding:utf-8 import re def dealwith(express): express.replace(‘+-‘,‘

iOS表示式簡單應用

想要了解基本語法的可以進入下面網站自行學習 自學地址Runoob 正則表示式在iOS的簡單應用 // 匹配小寫a開頭的字串 NSString * regex = @"^a.*"; NSPredicate *pred = [NSPredicate predicateWithForm

java表示式判斷一個字串是否是車牌號

public boolean checkCarNumber(String content) { String pattern = "([京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊]{1}(([A-HJ-Z]{1}[A-HJ-NP-Z0-9]{5})|([A-HJ-

QT 表示式從tableView中篩選出某一日期範圍內的資料

QDate date1,date2; date1=ui->dateEdit_2->date();//提取開始時間 date2=ui->dateEdit_3->date();//提取結束時間 data_filter->

C#表示式簡單總結

C#: c#中驗證正則表示式的類為System.Text.RegularExpressions.Regex 簡單的匹配方法為IsMatch(4個過載方法) 正則表示式語法: 一、匹配單個字元 [ ]:從中選擇一個字元匹配 如:單詞字元([ae])、非單詞

Java表示式判斷輸入的電話號碼格式是否正確

import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; /** *三大運營商號碼均可驗證(不含衛星通訊1349) */ p

怎麼表示式限制輸入框輸入數字的範圍(數字範圍是50-1000),怎麼限制輸入框輸入的數字是以9506開頭的

轉自 https://zhidao.baidu.com/question/1829801257322895700.html   <input type="text" onkeyup="var v=this.value||'';v=v.replace(/[^\d]/g,'')

表示式簡易實現

版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/ssjhust123/article/details/7760119 正則表示式        雖然正則表示式在 U n i x/Li

表示式-Python實現

1、概述: Regular Expression。縮寫regex,regexp,R等: 正則表示式是文字處理極為重要的工具。用它可以對字串按照某種規則進行檢索,替換。 Shell程式設計和高階程式語言中都支援正則表示式。 2、分類: BRE:基本正則表示式,grep、sed、vi等軟體支援,vim有

鬥圖網鬥圖全站爬取(表示式re)

import  re  import requests import os class doutu_spyder():     first_url=[]     first_name=[]     headers=