RegEx入門(mén)雜亂筆記

匹配URL地址

匹配目多級(jí)子目錄以及可選的args

匹配目標(biāo)地址或者主機(jī)名以及可選的port

匹配協(xié)議名以及可選的username:password

雖然Java不支持嵌入條件未舟,但想要匹配美國(guó)郵政編碼的話可以使用\b\d{5}(-\d{4})?(?!-)\b

Java的RegEx不支持嵌入條件也不支持POSIX元字符類(lèi)

正則表達(dá)式 想匹配出需要的內(nèi)容很容易實(shí)現(xiàn),但是要求其不能匹配出我們不需要的內(nèi)容(即精確匹配)卻很困難

Intellij IDEA也不支持嵌入條件
Java不支持嵌入條件
精確匹配郵箱地址

除了正前后查找還有舞骆,負(fù)前后查找琼富,他們的操作符分別是
(?!)(?<!)規(guī)則類(lèi)似

\b(?<!$)\d+\b
\b(?<=$)\d+\b

EaEb表達(dá)式蠕趁,前者匹配長(zhǎng)度可以是任意的
后者則必須是固定的掏呼,不能出現(xiàn)諸如* + {2,} 類(lèi)似的表達(dá)式
否則如果使用的是Java RegEx的話贮匕,將拋出
Exception in thread "main" java.util.regex.PatternSyntaxException: Look-behind group does not have an obvious maximum length near index XX
但如果如果是集合或者單個(gè)字符往史,卻可以配合使用如
(?<=[a-z]*) (?<=\d*) (?<=\w+) (?<=f*)
但這些是非法的
(?<=a\w*) (?<=k\d*) (?<=\w\w+) (?<=aa+)
換句話說(shuō),如果(positive lookahead)要匹配不固定長(zhǎng)黍瞧,那么只能是單個(gè)集合
(?<=[afgvds]{2,}) 這也是一個(gè)合法的向后查找

(?=Ea)為向前查找诸尽,在一個(gè)表達(dá)式的尾部
(?<=Eb)為向后查找,在一個(gè)表達(dá)式的尾部

Java即支持正向前查找(positive lookahead) 印颤,也支持正向后查找(positive lookbehind),他們是對(duì)某一位置的前后進(jìn)行查找您机,但它們并不是匹配結(jié)果的一部分。

Java RegEx不支持 \U \u \L \l \E這樣的元字符
但是Intellj IDEA支持

還原操作

RegEx Replace
\((\d{3})\) (\d{3}-\d{4}) $1-$2

替換操作

RegEx Replace
(\d{3})-(\d{3})(-)(\d{4}) ($1) $2-$4
(\d{3})-(\d{3}-)(\d{4}) ($1) $2$3 (而不是 ($1) $2-$3 必須要跨度大于1時(shí),-才被轉(zhuǎn)義)
(\d{3})-(\d{3}-\d{4}) ($1) $2
(?<header>\d{3})-(?<tail>\d{3}-\d{4}) (${header}) ${tail}
替換前 替換后
494-939-5505 (494) 939-5505
427-836-2491 (427) 836-2491
142-620-0294 (142) 620-0294
246-767-4276 (246) 767-4276
585-328-1029 (585) 328-1029

子表達(dá)式可用來(lái)進(jìn)行回溯引用匹配年局,用\1,\2,...\n來(lái)分別代表第n個(gè)表達(dá)式
但如果子表達(dá)式的相對(duì)位置發(fā)生了變化际看,整個(gè)模式也許就不能再完成原來(lái)的工作,刪除或添加子表達(dá)式的后果可能更為嚴(yán)重矢否。
所以仲闽,一些比較新的正則表達(dá)式實(shí)現(xiàn)還支持命名捕獲:給某個(gè)子表達(dá)式起一個(gè)唯一的名字,然后用這個(gè)名字(而不是相對(duì)位置)來(lái)引用這個(gè)子表達(dá)式.

Java RegEx 支持命名捕獲僵朗,可混合使用編號(hào)和命名來(lái)引用前面子表達(dá)式的內(nèi)容

     public static void main(String[] args) {
        String input = "<BODY>\n" +
                "<H1>Welcome to my Homepage</H1>\n" +
                "Content is divided into two sections:<BR>\n" +
                "<H2>ColdFusion</H2> <h2>ColdFusion</h2> <H3>Wireless</H5>\n" +
                "Information about Macromedia ColdFusion.\n" +
                "<H3>Wireless</H3>\n" +
                "<H3>Wireless</h3>\n" +
                "Information about Bluetooth, 802.11, and more.\n" +
                "</BODY>";//<(?<x>[Hh])(?<y>[1-6]).*?\1\k<y>>
        Pattern pattern = Pattern.compile("<(?<x>[Hh])(?<y>[1-6]).*?\\1\\k<y>>");
        Matcher matcher = pattern.matcher(input);
        System.out.println(pattern.pattern());
        while (matcher.find()) {
            System.out.println(matcher.group(0));//等價(jià)matcher.group()
            System.out.println(matcher.group(1));//回溯引用第一個(gè)子表達(dá)式匹配到的內(nèi)容
            System.out.println(matcher.group(2));//回溯引用第二個(gè)子表達(dá)式匹配到的內(nèi)容
            System.out.println(matcher.group("x"));//采用命名捕獲赖欣,回溯引用第一個(gè)子表達(dá)式匹配到的內(nèi)容
            System.out.println(matcher.group("y"));//采用命名捕獲屑彻,回溯引用第二個(gè)子表達(dá)式匹配到的內(nèi)容
        }
        System.out.println(matcher.toMatchResult().groupCount());//返回子表達(dá)式的個(gè)數(shù)
    }

匹配1個(gè)字節(jié)能表達(dá)的范圍0-255,使用
正則表達(dá)式\b(2[0-4]\d|25[0-5]|1?\d{1,2})\b
而不是\b(1?\d{1,2}|2[0-4]\d|25[0-5])\b
假如使用(1?\d{1,2}|2[0-4]\d|25[0-5])匹配255時(shí)候顶吮,將匹配255
而使用(1?\d{1,2}|2[0-4]\d|25[0-5])\.匹配255.時(shí)候社牲,將匹配255.而不是55.
但要匹配55.,則使用\B(1?\d{1,2}|2[0-4]\d|25[0-5])\.

\b((2[0-4]\d|25[0-5]|1?\d{1,2}).){3}(2[0-4]\d|25[0-5]|1?\d{1,2})\b

如果使用了(?m)的多行模式匹配悴了,那么^將匹配\n的結(jié)束位置膳沽,
$將匹配\n的開(kāi)始位置

Intellij IDEA默認(rèn)使用多行模式匹配

Java RegEx支持使用?(m)進(jìn)行多行模式匹配

[\s\S]將匹配任意字符類(lèi)似的都具有該功能如[\w\W],[\d\D]

(.|\n)也可以真正的匹配任意字符

        input = " a\n" +
                " /** this is a test \n" +
                "code \n" +
                "wo fas ga hdh sha\n" +
                "end?\n" +
                "*/*/\n" +
                "*/";//(?m)^\s*/\*[\S\s]*?\*/

        Pattern pattern = Pattern.compile("(?m)^\\s*/\\*[\\S\\s]*?\\*/");

        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) 
            System.out.println("[" + matcher.start() + ",\n" 
            + matcher.group() 
            + "\n," + matcher.end() + "]");
        
輸出結(jié)果:
[3,
 /** this is a test 
code 
wo fas ga hdh sha
end?
*/
,55]

^.*$可以匹配任意的非空字符串
\<\>也用來(lái)匹配單詞邊界,前者匹配單詞開(kāi)頭让禀,后者匹配單詞結(jié)尾挑社,
但是Java提供的正則表達(dá)式和Intellij IDEA都不支持,egrep程序支持

位置匹配元字符 功能描述
\b 不匹配任何字符,匹配\w\W之間的位置
\B 不匹配任何字符,匹配\w\w\W\W之間的位置

匹配連線符

string regex
nine-digit \b-\b
nine- digit \b-\B
nine - digit \B-\B
nine -digit \B-\b

\b匹配且只匹配一個(gè)位置巡揍,不匹配任何字符痛阻。用\bcat\b
匹配到的字符串的長(zhǎng)度是3個(gè)字符(c,a,t),不是5個(gè)字符。

貪婪型元字符 懶惰型元字符
* *?
+ +?
{m,} {m,}?
{m,n} {m,n}?

對(duì)于下面的那種情況腮敌,使用<[Bb]>.{1,16}</[Bb]>也會(huì)導(dǎo)致過(guò)度匹配.

<[Bb]>.*?</[Bb]使用*的懶惰版,加上?即可
<[Bb]>.*</[Bb]> 過(guò)度匹配

M{X(,Y)} ,Y是可選的
0=<X<=Y
表示前面的M模式將出現(xiàn)至少X次阱当,至多Y

?是一個(gè)元字符,如果要匹配?本身糜工,就必須使用它的轉(zhuǎn)義序列\?
該元字符的功能是匹配0個(gè)或1個(gè)字符
\*是一個(gè)元字符弊添,如果要匹配*本身,就必須使用它的轉(zhuǎn)義序列\\*
該元字符的功能是匹配0個(gè)或多個(gè)字符

\d+: $\d{3,}.\d{2}
#[0-9a-fA-F]{6}
\d{1,2}[-/]\d{1,2}[-/]\d{2,4}

[\r]?\n用來(lái)兼容在window和linux/unix上的換行符兼容

該正則表達(dá)式并不完善捌木,最后的那個(gè)錯(cuò)誤郵箱也會(huì)被匹配

+是一個(gè)元字符油坝,如果要匹配+本身,就必須使用它的轉(zhuǎn)義序列\+
該元字符的功能是匹配一個(gè)或多個(gè)字符(或字符集合),但至少匹配一個(gè)

Java 和 Intellij IDEA 都不支持POSIX字符類(lèi)`

可以使用16進(jìn)制或者是8進(jìn)制來(lái)表達(dá)正則表達(dá)式刨裆,但是用這種方式表達(dá)出的字符都是普通字符澈圈,
[\060\x2d\071]可以翻譯為[0-9]但是這個(gè)集合只包含0 - 9三個(gè)字符,等價(jià)于[0\-9]

正則表達(dá)式大小寫(xiě)敏感,而且通常對(duì)元字符來(lái)說(shuō)大寫(xiě)是小寫(xiě)的取非帆啃,如
\w \W 前者等價(jià) [a-zA-Z0-9_]瞬女,w是 word 的意思,類(lèi)似還有很多如
\d \D 前者等價(jià) [0-9]努潘,d是 digit 的意思

input = "1-8-5-189";//[0-5-9]  匹配不到8诽偷,正則表達(dá)式采用的貪心的方式0-5集合- 和9 組成的集合

Pattern pattern = Pattern.compile("[0-5-9]");

Matcher matcher = pattern.matcher(input);

var myArray = new Array();
...
if (myArray[0] == 0) {
...
}
if (myArray[1] == 0) {
...
}
if (myArray[2] == 0) {
...
}
if (myArray[3] == 0) {
...
}
matches here using regex: if (myArray[[0-9]] == 0) {\n...\n}
任何的一個(gè)元字符如果想要匹配其本身,都可以通過(guò)加上一個(gè)反斜杠做為其前綴的辦法疯坤。


.和[類(lèi)原始就是元字符报慕, t和n類(lèi)必須轉(zhuǎn)義后才算是元字符

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

/**
 * Created by E on 2017/8/1.
 */
@SuppressWarnings("UnusedAssignment")
public class _01 {
    //以下測(cè)試的正則表達(dá)式都適用于java語(yǔ)言中的字符串表達(dá)的正則表達(dá)式
    public static void main(String[] args) {
        String input;
        input = " car scar CAR Car CaR carry incarerate car carcar";//[Cc][Aa][Rr] 匹配所有car忽略大小寫(xiě)
        input = "Hello, my name is Ben. Please visit my website at http://www.forta.com/.ben";//純文本匹配
        String s = "sales1.xls " +
                "orders3.xls" +
                " sales2.xls" +
                " sales3.xls" +
                " apac1.xls" +
                " europe2.xls" +
                " na1.xls" +
                " na2.xls" +
                " sa1.xls ";//.a.\\.   對(duì)于后面的\\對(duì)應(yīng)一個(gè)java轉(zhuǎn)義為一個(gè)反斜杠,然后\.告訴正則表達(dá)式這不是一個(gè)模式贴膘,純文本
        input = s;

        input = "\\ 123.";//\\\\ java轉(zhuǎn)義為兩個(gè)\\卖子,正則表達(dá)式轉(zhuǎn)義成1個(gè)杠,然后匹配 字符串里面的一個(gè)杠杠\

        input = "a\n";//a.無(wú)法匹配失敗  .匹配任意字符除\n刑峡,\轉(zhuǎn)義

        input = "a\n";//a\\n \n匹配換行

        input = s + " usal.xls";//[ns]a.\.xls 元字符使用

        input = "The phrase \"regular expression\" is often\n" +
                "abbreviated as RegEx or regex";//[Rr]eg[Ee]x

        input = "sa2.java sa3.java sa6.java sa4.java sal.java ana3.java";//[ns]a[2-4].ja

        input = "aaaaaaa";//aaa 只會(huì)匹配出2個(gè)洋闽,不會(huì)重疊匹配

        input = "[a\\";//\\[a\\   ,  [Z-a]a[Z-a]

        input = "<BODY BGCOLOR=\"#33A6b3\" TEXT=\"#FFfFFF\" MARGINWIDTH=\"0\" MARGINHEIGHT=\"0\" TOPMARGIN=\"0\" LEFTMARGIN=\"0\">";//#[0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f][0-9A-Fa-f]

        input = "a2 b3 n4 zu qe su nd n8 68 4a t6";//[a-z][^2-4 86]   X-Y,X和Y僅指單個(gè)字符對(duì)于后面的字符X都將屬于這個(gè)集合
        //[.]與\.等價(jià),不然如[.af]沒(méi)有意義af已經(jīng)被包括在.所描述的集合范圍內(nèi)了,所以將失去他的原本功能

        Pattern pattern = Pattern.compile("");

        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while (matcher.find()) {//輸出
            System.out.println("[" + matcher.start() + "," + matcher.group() + "," + matcher.end() + "]");
            count++;
        }
        System.out.println(count);
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市突梦,隨后出現(xiàn)的幾起案子诫舅,更是在濱河造成了極大的恐慌,老刑警劉巖宫患,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊懈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡娃闲,警方通過(guò)查閱死者的電腦和手機(jī)虚汛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)皇帮,“玉大人卷哩,你說(shuō)我怎么就攤上這事∈羰埃” “怎么了将谊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)渐白。 經(jīng)常有香客問(wèn)我尊浓,道長(zhǎng),這世上最難降的妖魔是什么纯衍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任栋齿,我火速辦了婚禮,結(jié)果婚禮上襟诸,老公的妹妹穿的比我還像新娘褒颈。我一直安慰自己,他們只是感情好励堡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谷丸。 她就那樣靜靜地躺著,像睡著了一般应结。 火紅的嫁衣襯著肌膚如雪刨疼。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天鹅龄,我揣著相機(jī)與錄音揩慕,去河邊找鬼。 笑死扮休,一個(gè)胖子當(dāng)著我的面吹牛迎卤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播玷坠,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜗搔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼劲藐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起樟凄,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤聘芜,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后缝龄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體汰现,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年叔壤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瞎饲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡炼绘,死狀恐怖嗅战,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饭望,我是刑警寧澤仗哨,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站铅辞,受9級(jí)特大地震影響厌漂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斟珊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一苇倡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧囤踩,春花似錦旨椒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至勤庐,卻和暖如春示惊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背愉镰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工米罚, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丈探。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓录择,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隘竭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理塘秦,服務(wù)發(fā)現(xiàn),斷路器货裹,智...
    卡卡羅2017閱讀 134,667評(píng)論 18 139
  • 正則表達(dá)式到底是什么東西嗤形?字符是計(jì)算機(jī)軟件處理文字時(shí)最基本的單位精偿,可能是字母弧圆,數(shù)字,標(biāo)點(diǎn)符號(hào)笔咽,空格搔预,換行符,漢字等...
    獅子挽歌閱讀 2,148評(píng)論 0 9
  • 注:本篇文章只為方便查看叶组,特此保留拯田,如有冒犯,敬請(qǐng)諒解Kκ4印! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么侣监,并對(duì)它...
    阿杰Alex閱讀 1,483評(píng)論 0 10
  • 揭開(kāi)正則表達(dá)式的神秘面紗(轉(zhuǎn)) 關(guān)閉高亮 [原創(chuàng)文章鸭轮,轉(zhuǎn)載請(qǐng)保留或注明出處:http://www.regexlab...
    螃蟹六步郎閱讀 326評(píng)論 0 0
  • 1. oust 逐出,奪取 He was ousted as a manager. 2. impeachment ...
    Bebevino閱讀 89評(píng)論 0 0