1.正則表達式基礎知識#
(有一部分知識與圖片,轉自網絡上的博客,因找不到鏈接,在此謝謝博客作者)
概念:符合一定規(guī)則的表達式,作用是專門用于操作字符串;
特點:用一些特定的符號來表示一些代碼操作,簡化了書寫;
好處:可以簡化對字符串操作;
弊端:符號定義越多,正則越長,閱讀性越差;
具體操作功能:
- 匹配:對字符串進行規(guī)則驗證,如:String類中的mathes方法,用規(guī)則匹配整個字符串,只要有一處不符合規(guī)則,就匹配結束,返回false;否則返回true;
- 切割:如String的split方法;
- 替換:如String的replaceAll方法;
- 獲取:將符合規(guī)則的子串取出來;
操作步驟:
- 將正則表達式封裝成對象;
- 讓正則對象和要操作的字符串相關聯;
- 關聯后,獲取正則匹配引擎;
- 通過引擎對符合規(guī)則的子串進行操作,比如取出;
1.1句點符號:
假設你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用正則表達式搜索它的全部內容。要構造出這個正則表達式,你可以使用一個通配符——句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t
n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符:
1.2方括號符號:
為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內你只能匹配單個字符:
1.3“或”符號
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達式。這里不能使用方擴號,因為方括號只允許匹配單個字符;這里必須使用圓括號“()”。圓括號還可以用來分組,具體請參見后面介紹。
1.4表示匹配次數的符號
表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數:
假設我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字符(“-”)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上一個轉義字符“\”。
假設進行搜索的時候,你希望連字符號可以出現,也可以不出現——即,999-99-9999和999999999都屬于正確的格式。這時,你可以在連字符號后面加上“?”數量限定符號,如圖所示:
匹配所有123-12-1234和123121234形式的社會安全號碼
下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數字加上二個字母。它的正則表達式前面是數字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。下圖顯示了完整的正則表達式。
匹配典型的美國汽車牌照號碼,如8836KV
1.5“否”符號(^):
“”符號稱為“否”符號。如果用在方括號內,“”表示不想要匹配的字符。例如,圖四的正則表達式匹配所有單詞,但以“X”字母開頭的單詞除外。
圖:匹配所有單詞,但“X”開頭的除外
1.6圓括號和空白符號(s):
假設要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示:
圖:匹配所有Moth DD,YYYY格式的日期
新出現的“\s”符號是空白符號,匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創(chuàng)建一個組,然后用ORO API(本文后面詳細討論)提取出它的值。修改后的正則表達式如圖六所示:
圖:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個組
1.7其它符號:
為簡便起見,你可以使用一些為常見正則表達式創(chuàng)建的快捷符號。如表二所示:
例如,在前面社會安全號碼的例子中,所有出現“[0-9]”的地方我們都可以使用“\d”。修改后的正則表達式如圖七所示:
圖:匹配所有123-12-1234格式的社會安全號碼