中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Java 正則表達(dá)式小例子

2018-07-20    來(lái)源:open-open

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

正則表達(dá)式概念 

正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。正則表達(dá)式可以用形式化語(yǔ)言理論的方式來(lái)表達(dá),它由常量和算子組成,它們分別指示字符串的集合和在這些集合上的運(yùn)算。

正則表達(dá)式用途

  1. 驗(yàn)證:字符串是否符合指定特征,比如驗(yàn)證是否是合法的郵件地址;
  2. 查找:從一個(gè)長(zhǎng)的文本中查找符合指定特征的字符串,比查找固定字符串更加靈活方便;
  3. 替換:比普通的替換更強(qiáng)大,替換符合指定特征的字符串;

正則表達(dá)式引擎 

正則表達(dá)式的匹配是通過(guò)正則表達(dá)式引擎實(shí)現(xiàn)的。正則表達(dá)式引擎分為兩類(lèi):

  1. 基于NFA ( Nondeterministic Finite Automata,非確定型有窮狀態(tài)自動(dòng)機(jī));
  2. 基于DFA ( Deterministic Finite Automaton,確定型有窮狀態(tài)自動(dòng)機(jī));

DFA和NFA的區(qū)別在于,DFA對(duì)于一個(gè)狀態(tài)和一個(gè)輸入,一定會(huì)有一個(gè)唯一的后續(xù)狀態(tài),而NFA可能有多個(gè)狀態(tài),也可能沒(méi)有。一般來(lái)說(shuō),DFA正 則在編譯的時(shí)候花的時(shí)間會(huì)多一點(diǎn),但是在匹配的時(shí)候會(huì)更快一點(diǎn)。NFA出現(xiàn)較早,Java、.Net、PHP、Ruby、Perl、Python、GNU Emacs、ed、sec、vi、grep都是使用NFA,而DFA只有egrep awk lex flex這些支持。所以,NFA引擎在生產(chǎn)環(huán)境里使用較多。

匹配的規(guī)則

  1. 優(yōu)先選擇最左端的結(jié)果;
  2. 對(duì)標(biāo)準(zhǔn)匹配量詞'{m,n}'、'+'、'*'、'?'優(yōu)先使用貪婪模式;

Java正則表達(dá)式Demo

自己寫(xiě)了一個(gè)demo,從鍵盤(pán)獲取pattern,匹配文件 (默認(rèn)本工程下tests.txt, 也可以自己輸入文件路徑) 中的字符串,并逐行顯示匹配結(jié)果,方便驗(yàn)證自己寫(xiě)的正則表達(dá)式。

    import java.io.File;  
    import java.io.FileNotFoundException;  
    import java.util.Scanner;  
    import java.util.regex.Matcher;  
    import java.util.regex.Pattern;  
      
    public class RegexDemo {  
        private String content;  
      
        public RegexDemo() {  
            this("test.txt"); // 默認(rèn)這個(gè)文件  
        }  
      
        public RegexDemo(String fileName) {  
            this.content = (readFileToString(new File(fileName)));  
        }  
      
        /* 匹配符合模式的字符串并逐個(gè)顯示 */  
        public void matchNum(String input) {  
            int sum = 1;  
            Pattern pattern = Pattern.compile(input, Pattern.DOTALL); //"."符號(hào)可以匹配行尾  
            Matcher matcher = pattern.matcher(content);  
            while (matcher.find()) {  
                System.out.println("Case" + (sum++) + ": " + matcher.group());  
            }  
        }  
          
        /* 讀取文件到一個(gè)字符串 */  
        private String readFileToString(File file) {  
            StringBuilder stringBuilder = new StringBuilder();  
            try {  
                Scanner scanner = new Scanner(file);  
                while (scanner.hasNextLine()) {  
                    stringBuilder.append(scanner.nextLine() + "\n");  
                }  
                scanner.close();  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }  
            return stringBuilder.toString();  
        }  
      
        public static void main(String[] args) {  
            RegexDemo regexTest = new RegexDemo(); //默認(rèn)用本工程下的text.txt文件  
            Scanner scanner = new Scanner(System.in);  
            String input = null;  
            while (scanner.hasNextLine()) {  
                input = scanner.nextLine();  
                regexTest.matchNum(input);  
            }  
            scanner.close();  
        }  
    }  

測(cè)試文件tests.txt內(nèi)容:

demo.anonymous@gmail.com
hello@163.com  192.168.20.2
http://www.jb51.net/tools/regex.htm
<p>第一段</p>
http://www.jb51.net/tools/regex.htm

控制臺(tái)運(yùn)行:

[a-zA-z]+://[^\s]* Case1: http://www.jb51.net/tools/regex.htm
Case2: http://www.jb51.net/tools/regex.htm ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) Case1: 192.168.20.2 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* Case1: demo.anonymous@gmail.com
Case2: hello@163.comdemo 

參考

  • 正則表達(dá)式wiki
  • 正則表達(dá)式30分鐘入門(mén)教程
  • 正則表達(dá)式原理

標(biāo)簽:

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:Java日期時(shí)間操作代碼示例大全

下一篇:支持括號(hào)的仿android計(jì)算器