Java正則表達式易錯常識點匯總。本站提示廣大學習愛好者:(Java正則表達式易錯常識點匯總)文章只能為提供參考,不一定能成為您想要的結果。以下是Java正則表達式易錯常識點匯總正文
1、概述
正則表達式是Java處置字符串、文本的主要對象。
Java對正則表達式的處置集中在以下兩個類:
java.util.regex.Matcher 形式類:用來表現一個編譯過的正則表達式。
java.util.regex.Pattern 婚配類:用形式婚配一個字符串所表達的籠統成果。
(很遺憾,Java Doc並沒有給出這兩個類的職責概念。)
好比一個簡略例子:
import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 正則表達式例子 * * @author leizhimin 2009-7-17 9:02:53 */ public class TestRegx { public static void main(String[] args) { Pattern p = Pattern.compile("f(.+?)k"); Matcher m = p.matcher("fckfkkfkf"); while (m.find()) { String s0 = m.group(); String s1 = m.group(1); System.out.println(s0 + "||" + s1); } System.out.println("---------"); m.reset("fucking!"); while (m.find()) { System.out.println(m.group()); } Pattern p1 = Pattern.compile("f(.+?)i(.+?)h"); Matcher m1 = p1.matcher("finishabigfishfrish"); while (m1.find()) { String s0 = m1.group(); String s1 = m1.group(1); String s2 = m1.group(2); System.out.println(s0 + "||" + s1 + "||" + s2); } System.out.println("---------"); Pattern p3 = Pattern.compile("(19|20)\\d\\d([- /.])(0[1-9]|1[012])\\2(0[1-9]|[12][0-9]|3[01])"); Matcher m3 = p3.matcher("1900-01-01 2007/08/13 1900.01.01 1900 01 01 1900-01.01 1900 13 01 1900 02 31"); while (m3.find()) { System.out.println(m3.group()); } } }
輸入成果:
fck||c
fkk||k
---------
fuck
finish||in||s
fishfrish||ishfr||s
---------
1900-01-01
2007/08/13
1900.01.01
1900 01 01
1900 02 31
Process finished with exit code 0
2、一些輕易含混的成績
1、Java對反斜線處置的成績
在其他說話中,\\表現要拔出一個字符\;
在Java說話中,\\表現要拔出正則表達式的反斜線,而且前面的字符有特別意義。
a.預界說字符類
. 任何字符(與行停止符能夠婚配也能夠不婚配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w]
然則看看下面法式,比較下不好看出:
\d在現實應用的時刻就寫成了 \\d;
在Java正則表達式中,假如要拔出一個\字符,則須要在正則表達式中寫成\\\\,緣由是上面的APIDoc界說\\表現一個反斜線。
然則假如在正則表現式中表現回車換行等,則不須要多添加反斜線了。好比回車\r就寫作\r.
b.字符
x 字符 x
\\ 反斜線字符
\0n 帶有八進制值 0 的字符 n (0 <= n <= 7)
\0nn 帶有八進制值 0 的字符 nn (0 <= n <= 7)
\0mnn 帶有八進制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh 帶有十六進制值 0x 的字符 hh
\uhhhh 帶有十六進制值 0x 的字符 hhhh
\t 制表符 ('\u0009')
\n 新行(換行)符 ('\u000A')
\r 回車符 ('\u000D')
\f 換頁符 ('\u000C')
\a 報警 (bell) 符 ('\u0007')
\e 本義符 ('\u001B')
\cx 對應於 x 的掌握符
2、Matcher.find():測驗考試查找與形式婚配的字符序列的下一個子序列。此辦法從字符序列的開首開端,假如該辦法的前一次挪用勝利了而且從那時開端婚配器沒有被重置,則從之前婚配操作沒有婚配的第一個字符開端,即假如前一次找到與形式婚配的子序列則此次從這個子序列後開端查找。
3、Matcher.matchers():斷定全部字符序列與形式能否婚配。當持續用Matcher對象檢討多個字符串時刻,可使用
Matcher.reset():重置婚配器,廢棄其一切顯式狀況信息並將其添加地位設置為零。
或許Matcher.reset(CharSequence input) 重置此具有新輸出序列的婚配器,來反復應用婚配器。
4、組的概念,這個概念很主要,組是用括號劃分的正則表達式,可以經由過程編號來援用組。組號從0開端,有幾對小括號就表現有幾個組,而且組可以嵌套,組號為0的表現全部表達式,組號為1的表現第一個組,依此類推。
例如:A(B)C(D)E正則式中有三組,組0是ABCDE,組1是B,組2是D;
A((B)C)(D)E正則式中有四組:組0是ABCDE,組1是BC,組2是B;組3是C,組4是D。
int groupCount():前往婚配其形式中組的數量,不包含第0組。
String group():前往前一次婚配操作(如find())的第0組。
String group(int group):前往前一次婚配操作時代指定的組所婚配的子序列。假如該婚配勝利,但指定組未能婚配字符序列的任何部門,則前往 null。
int start(int group):前往前一次婚配操作時代指定的組所婚配的子序列的初始索引。
int end(int group):前往前一次婚配操作時代指定的組所婚配的子序列的最初索引+1。
5、婚配的規模的掌握
最失常的就要算lookingAt()辦法了,名字很讓人困惑,須要賣力看APIDoc。
start() 前往之前婚配的初始索引。
end() 前往最初婚配字符以後的偏移量。
public boolean lookingAt()測驗考試將從區域開首開端的輸出序列與該形式婚配。
與 matches 辦法相似,此辦法一直從區域的開首開端;與之分歧的是,它不須要婚配全部區域。
假如婚配勝利,則可以經由過程 start、end 和 group 辦法獲得更多信息。
前往:
當且僅當輸出序列的前綴婚配此婚配器的形式時才前往 true。
小編為年夜家整頓了這些易混常識點,然則照樣不敷周全,須要年夜家在以後的進修中赓續積聚,正則表達式最年夜的難點在於闇練書寫正則表達式,年夜家應當針對難點停止進修,信任必定會有所收成。