java正則表達(dá)式

介紹

正則表達(dá)式犹芹,又稱(chēng)正規(guī)表示法、常規(guī)表示法(英語(yǔ):Regular Expression阁苞,在代碼中常簡(jiǎn)寫(xiě)為regex困檩、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念那槽。正則表達(dá)式使用單個(gè)字符串來(lái)描述悼沿、匹配一系列符合某個(gè)句法規(guī)則的字符串。在很多文本編輯器里骚灸,正則表達(dá)式通常被用來(lái)檢索糟趾、替換那些符合某個(gè)模式的文本。

幾個(gè)重要的正則表達(dá)式:

  • 用戶(hù)名(6-15位字母和數(shù)字的組合): /^(?=.[A-Za-z])(?=.\d)[A-Za-z\d]{6,15}$/;
  • 電話(huà) :/^1[34578]\d{9}$/
  • 兩位小數(shù): /^[0-9]+.?[0-9]{0,2}$/
  • 郵箱: /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/
  • url:/^[a-zA-z]+://(\w+(-\w+))(\.(\w+(-\w+)))(\?\S)?$/
    更多數(shù)字的正則

常用應(yīng)用

主要是分三種應(yīng)用

  • 文本替換 例如 ide
  • 輸入驗(yàn)證 例如 登錄驗(yàn)證
  • 文本摘取 例如爬蟲(chóng)

案例

/**
 * 字符串規(guī)則驗(yàn)證
 * @param regexp 正則表達(dá)式
 * @param str     待驗(yàn)證字符串
 * @return       字符串是否符合正則表達(dá)式規(guī)則
 */
public static boolean test(String regexp,String str){
    //編譯正則表達(dá)式 返回Pattern對(duì)象
    Pattern pattern=Pattern.compile(regexp);
    //驗(yàn)證字符串返回Matcher對(duì)象
    Matcher match = pattern.matcher(str);
    //返回是否在字符串中找到匹配的子字符串
    return match.find();
}

正則表達(dá)式規(guī)則

  • {} 表示個(gè)數(shù)
  • [] 表示字符集合
  • () 表示組
  • \ 轉(zhuǎn)譯

1.{} 表示個(gè)數(shù)

正則表達(dá)式 實(shí)際上就是通過(guò)一個(gè)簡(jiǎn)化的規(guī)則去描述字符串
比如 "aaaa..." 有25個(gè)a
正則表達(dá)式的描述就是 a{25}
"aaa....bbb...."25個(gè)a 和26個(gè)b
正則表達(dá)式的描述就是 a{25}b{26}
這是精確匹配
假設(shè) 有一堆字符串 "a..."25個(gè)a "a..."10個(gè)a "a..."6個(gè)a
a{6,25} 表示 a個(gè)數(shù)可以是6個(gè) 7個(gè)甚牲,8個(gè) 义郑。。鳖藕。25個(gè)
這種是模糊匹配
假設(shè) 有一堆字符串 "a..."25個(gè)a "a..."10個(gè)a "a..."6個(gè)a
a{6,25} 表示 a個(gè)數(shù)可以是6個(gè) 7個(gè)魔慷,8個(gè) 只锭。著恩。。25個(gè)
這種是模糊匹配
那么有兩個(gè)特殊的字符 來(lái)表示
a{1,} === a+ +表示1到多個(gè)
a{0,} === a* *表示0到多個(gè)

2.[] 集合

"a..b..aabbababab.."26個(gè)字符

假設(shè)有這個(gè)字符串
ab交替混合 不規(guī)則出現(xiàn)
正則表達(dá)式的描述就是 [ab]{26}
[1-5]{26}===[12345]{26}
[a-e]===[abcde]
[0-9]====\d 表示0-9
[A-Za-z0-9_]===\w 表示所有字符
[^0-3]表示不出現(xiàn)0123

3.\ 轉(zhuǎn)義符

\n 換行符 \t tab符 \r 回車(chē)符 \f 換頁(yè)符 \v 垂直tab
\d 數(shù)字 \w 字符和數(shù)字加下劃線(xiàn) \s [ \n\t\r\f\v]
\W [^\w] \D [^\d] \S [^\s]
\b 單詞邊界 \B [^\b]

4.() 組

()括起來(lái)的正則表達(dá)式 表示一個(gè)組
被括起來(lái)的正則表達(dá)式匹配的字符 可以用$1表示
假設(shè)有2個(gè)()
那么第一個(gè)就是$1 第二個(gè)就是$2

eg1:

 System.out.println("123---123-----123".replaceAll("(1)2(3)","$1a$2b"));
 //輸出
 //1a3b---1a3b-----1a3b

eg2:

abc
bcd
ece

對(duì)文件每行的頭尾加上單引號(hào)

   System.out.println("abc\nbcd\ncdc\n".replaceAll("(\\w+)\\n","'$1'\n"));
結(jié)果

完成一個(gè)Regexp的工具類(lèi)(成果)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by ASUS on 2017/9/11.
 */
public class RegExp {  /**
 * 字符串規(guī)則驗(yàn)證
 * @param regexp 正則表達(dá)式
 * @param str     待驗(yàn)證字符串
 * @return       字符串是否符合正則表達(dá)式規(guī)則
 */
public static boolean test(String regexp,String str){
    //編譯正則表達(dá)式 返回Pattern對(duì)象
    Pattern pattern= Pattern.compile(regexp);
    //驗(yàn)證字符串返回Matcher對(duì)象
    Matcher match = pattern.matcher(str);
    //返回是否在字符串中找到匹配的子字符串
    return match.find();
}

    /**
     *  替換字符串
     * @param source
     * @param regexp
     * @param str
     * @return
     */
    public static String replace(String source,String regexp,String str){
        return source.replaceAll(regexp,str);
    }

    /**
     * 正則表達(dá)式替換方程
     */
    public interface ReplaceFunc{
        /**
         * 根據(jù)輸入的匹配項(xiàng)返回替換的對(duì)象
         * @param args args[0]=matcher args[1]=$1,args[2]=$2 ......
         * @return 替換字符串
         */
        String func(String... parms);
    }

    /**
     * 可控的替換過(guò)程
     * @param source 源字符串
     * @param regexp 正則表達(dá)式
     * @param func   替換方法
     * @return
     */
    public static String replace(String source,String regexp,ReplaceFunc func){
        Pattern pattern=Pattern.compile(regexp);
        Matcher matcher = pattern.matcher(source);
        StringBuffer sb = new StringBuffer();
        while(matcher.find()){

            String parms[]=new String[matcher.groupCount()+1];
            for (int i = 0; i <parms.length; i++) {
                parms[i]=matcher.group(i);
            }
            if(parms.length!=0){
                matcher.appendReplacement(sb, func.func(parms));
            }
        }
        matcher.appendTail(sb);
        return sb.toString();
    }


}

例子
這樣我可以控制正則匹配的每一步 并作出對(duì)應(yīng)的操作來(lái)修改返回字符串
eg1:

String result = RegExp.replace("abc\nbcd\ncdc\n", "(\\w+)\\n", new RegExp.ReplaceFunc() {
    @Override
    public String func(String... parms) {
        String $1 = parms[1];
        if("abc".equals($1)){
            return "'ABC'\n";
        }else if("bcd".equals($1)){
            return "'BcD'\n";
        }
        return "'" + $1 + "'\n";
    }
});
System.out.println(result);
結(jié)果

eg2:

   String abc= RegExp.replace("123\n--123\n--123\n", "(1+)2(3)", new RegExp.ReplaceFunc() {
            @Override
            public String func(String ...parms) {
                String $1=parms[1];
                String $2=parms[2];

                return $1+"a"+$2;
            }
        });
        System.out.println(abc);
結(jié)果
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜻展,一起剝皮案震驚了整個(gè)濱河市喉誊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纵顾,老刑警劉巖伍茄,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異施逾,居然都是意外死亡敷矫,警方通過(guò)查閱死者的電腦和手機(jī)例获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曹仗,“玉大人榨汤,你說(shuō)我怎么就攤上這事≡趺#” “怎么了收壕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)轨蛤。 經(jīng)常有香客問(wèn)我蜜宪,道長(zhǎng),這世上最難降的妖魔是什么祥山? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任圃验,我火速辦了婚禮,結(jié)果婚禮上缝呕,老公的妹妹穿的比我還像新娘损谦。我一直安慰自己,他們只是感情好岳颇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布照捡。 她就那樣靜靜地躺著,像睡著了一般话侧。 火紅的嫁衣襯著肌膚如雪栗精。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天瞻鹏,我揣著相機(jī)與錄音悲立,去河邊找鬼。 笑死新博,一個(gè)胖子當(dāng)著我的面吹牛薪夕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赫悄,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼原献,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了埂淮?” 一聲冷哼從身側(cè)響起姑隅,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倔撞,沒(méi)想到半個(gè)月后讲仰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痪蝇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鄙陡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冕房。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趁矾,死狀恐怖毒费,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情愈魏,我是刑警寧澤觅玻,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站培漏,受9級(jí)特大地震影響溪厘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牌柄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一畸悬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧珊佣,春花似錦蹋宦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至惑艇,卻和暖如春蒿辙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背滨巴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工思灌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恭取。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓泰偿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親蜈垮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耗跛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Java的正則表達(dá)式講解:(為了能看清,本文正則表達(dá)式用中文的句號(hào)代替英文句點(diǎn)) 英文句點(diǎn)符號(hào):匹配單個(gè)任意字符窃款。...
    紅姑娘閱讀 4,351評(píng)論 0 2
  • 1匹配驗(yàn)證-驗(yàn)證Email是否正確 2在字符串中查詢(xún)字符或者字符串 3常用正則表達(dá)式 規(guī)則 正則表達(dá)式語(yǔ)法一個(gè)或...
    大赟哥閱讀 470評(píng)論 0 0
  • 表達(dá)式意義: 1.字符 x 字符 x课兄。例如a表示字符a {Java學(xué)習(xí)資料免費(fèi)分享微信:tangniu5206...
    尚學(xué)先生閱讀 331評(píng)論 0 0
  • 一首歌反復(fù)聽(tīng)五六遍就會(huì)生厭了牍氛。 人是很善變的動(dòng)物晨继,前幾天晚上朋友幾個(gè)相約吃燒烤,有男生喝大了搬俊,認(rèn)真地沉思了一會(huì)兒說(shuō)...
    千秋名閱讀 169評(píng)論 0 0
  • 少年時(shí)代的伙伴自大洋彼岸歸來(lái)探親紊扬,多年未見(jiàn)蜒茄,把盞竟夜長(zhǎng)談,我們聊到故鄉(xiāng)種種情形餐屎,特別談到了家鄉(xiāng)方言檀葛,興之所至...
    L__Smile閱讀 824評(píng)論 0 0