java----正则表达式
生活随笔
收集整理的這篇文章主要介紹了
java----正则表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正則表達式
一、正則表達式
正則表達式:符合一定規則的表達式。
作用:用于專門操作字符串。
特點:用一些特定的符號來表示一些代碼操作。簡化代碼書寫。學習正則表達式,就是在學習一些特殊符號的使用。
練習:對QQ號碼進行校驗。
要求:5~15位,0不能開頭,只能是數字。
class Demo
{public static void main(String []args) throws Exception{String QQ = "63224d5";if(QQ.length()>=5&&QQ.length()<=15){if(QQ.charAt(0)!='0'){char[] chs = QQ.toCharArray();boolean flag = true;for(int x=0;x<chs.length;x++){if(!(chs[x]>='0'&&chs[x]<='9')){flag = false;break;}}if(flag){System.out.println(QQ);}elseSystem.out.println("非法字符");}else{System.out.println("不能以0開頭");}}else{System.out.println("號碼長度錯誤");}}
}分析:這種方式使用了String類中的方法進行組合,完成了需求,但是代碼過于復雜。
使用正則表達式:
boolean matches(String regex) 告知此字符串是否匹配給定的正則表達式。 例:
class Demo
{public static void main(String []args) throws Exception{String QQ = "21445";String regex = "[1-9][0-9]{4,14}";if(QQ.matches(regex)){System.out.println(QQ);}elseSystem.out.println("不合法");}
}正則表達式:
字符
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 的控制符 字符類
[abc] a、b 或 c(簡單類)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,兩頭的字母包括在內(范圍)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](減去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](減去) 預定義字符類
. 任何字符(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 單詞字符:[a-zA-Z_0-9]
\W 非單詞字符:[^\w] POSIX 字符類(僅 US-ASCII)
\p{Lower} 小寫字母字符:[a-z]
\p{Upper} 大寫字母字符:[A-Z]
\p{ASCII} 所有 ASCII:[\x00-\x7F]
\p{Alpha} 字母字符:[\p{Lower}\p{Upper}]
\p{Digit} 十進制數字:[0-9]
\p{Alnum} 字母數字字符:[\p{Alpha}\p{Digit}]
\p{Punct} 標點符號:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} 可見字符:[\p{Alnum}\p{Punct}]
\p{Print} 可打印字符:[\p{Graph}\x20]
\p{Blank} 空格或制表符:[ \t]
\p{Cntrl} 控制字符:[\x00-\x1F\x7F]
\p{XDigit} 十六進制數字:[0-9a-fA-F]
\p{Space} 空白字符:[ \t\n\x0B\f\r] java.lang.Character 類(簡單的 java 字符類型)
\p{javaLowerCase} 等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase} 等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace} 等效于 java.lang.Character.isWhitespace()
\p{javaMirrored} 等效于 java.lang.Character.isMirrored() Unicode 塊和類別的類
\p{InGreek} Greek 塊(簡單塊)中的字符
\p{Lu} 大寫字母(簡單類別)
\p{Sc} 貨幣符號
\P{InGreek} 所有字符,Greek 塊中的除外(否定)
[\p{L}&&[^\p{Lu}]] 所有字母,大寫字母除外(減去) 邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用于最后的結束符(如果有的話)
\z 輸入的結尾 Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次 Reluctant 數量詞
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超過 m 次 Possessive 數量詞
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超過 m 次 Logical 運算符
XY X 后跟 Y
X|Y X 或 Y
(X) X,作為捕獲組 Back 引用
\n 任何匹配的 nth 捕獲組 引用
\ Nothing,但是引用以下字符
\Q Nothing,但是引用所有字符,直到 \E
\E Nothing,但是結束從 \Q 開始的引用 特殊構造(非捕獲)
(?:X) X,作為非捕獲組
(?idmsux-idmsux) Nothing,但是將匹配標志i d m s u x on - off
(?idmsux-idmsux:X) X,作為帶有給定標志 i d m s u x on - off
的非捕獲組 (?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作為獨立的非捕獲組
常見操作:
1.匹配:matches方法,用規則匹配整個字符串,只有不符合規則,匹配結束,返回false。
練習:手機號判斷。只有13XXX,15XXX,18XXX。
class Demo {public static void main(String []args) throws Exception{String tel = "15508888888";String regex = "[1][358][0-9]{9}";if(tel.matches(regex))System.out.println("ok");elseSystem.out.println("sorry");} }2.切割:split方法。 class Demo {public static void main(String []args) throws Exception{String name = "zhangsan lisi wangwu";String regex = " +";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
注:“.”是特殊符號,“\.”又是正則表達式,所以要想表示一個“.”符號必須轉義——“\\.”。“\”也是特殊字符,所以表示一個“\”也必須轉義——“\\”。 例: class Demo {public static void main(String []args) throws Exception{String name = "Demo.java";String regex = "\\.";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
例: class Demo {public static void main(String []args) throws Exception{String name = "c:\\abc\\a.txt";String regex = "\\\\";//一個"\"只轉義一個"\"String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
練習:切疊詞。 為了讓規則結果被重用,可以將規則封裝成一個組,用“()”完成。組的出現都有編號,從1開始。要使用已有的組,可以通過“\n”(n代表組編號)的形式獲取。 class Demo {public static void main(String []args) throws Exception{String name = "dsadakkkhdeezooo";String regex = "(.)\\1+";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
3.替換:replaceAll方法。 練習:將字符串中出現5次的數字換成“#”號。 class Demo {public static void main(String []args) throws Exception{String str = "asfasf46366ffaso9qw899";String regex = "\\d{5,}";str = str.replaceAll(regex,"#");System.out.println(str);} }
練習:將疊詞替換成“#”號。 class Demo {public static void main(String []args) throws Exception{String str = "wkkidssrvjjjyt";System.out.println(str);String regex = "(.)\\1+";str = str.replaceAll(regex,"#");System.out.println(str);} }
練習:將疊詞替換成單個字符。“$”獲取組里的元素。 class Demo {public static void main(String []args) throws Exception{String str = "wkkidssrvjjjyt";System.out.println(str);String regex = "(.)\\1+";str = str.replaceAll(regex,"$1");System.out.println(str);} }
4.獲取:將字符串中符合規則的字串取出。 操作步驟: 1.將正則表達式封裝成對象。 2.讓正則對象和要操作的字符串相關聯。 3.關聯后獲取正則匹配引擎。 4.通過引擎對符合規則的字串進行操作,比如取出。 java.util.regex:正則包。 Pattern:正則對象。 練習:將不超過三個字母的單詞取出。 import java.util.regex.*; class Demo {public static void main(String []args) throws Exception{String str = "ming tian jiu yao fang jia le,da jia.";//"\b"為單詞邊界匹配器String regex = "\\b[a-z]{1,3}\\b";//將規則封裝成對象Pattern p = Pattern.compile(regex);//讓正則對象和要作用的字符串相關聯,獲取匹配器對象。Matcher稱為引擎或匹配器。Matcher m = p.matcher(str);while(m.find()){System.out.println(m.group());}} }
其實,String類中的matches方法,用的就是Pattern和Matcher對象來完成的,只不過被String的方法封裝后,用起來較為簡單,但是功能單一。 容易疏忽的地方: import java.util.regex.*; class Demo {public static void main(String []args) throws Exception{String str = "jiu yao fang jia le,da jia.";String regex = "\\b[a-z]{1,3}\\b";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);System.out.println(m.matches());while(m.find()){System.out.println(m.group());}} }
jiu也滿足了條件,可是卻沒有打印出來,這是神馬呢? 答:和Iterator的hasNext一樣,m.matches();已經將指針(索引)往后移了一位。所以也就沒有打印jiu。 練習:將下列字符串轉成:我要學編程。 我我.....我我........我要.......要要......要要.......學學.....學學......編編.....程....程程.....程.....程 到底用四種功能中的哪一種呢?或者哪幾個呢?
思考方式: 1.如果只想知道該字符串是對是錯,可以使用匹配。 2.想要將已有的字符串變成另一個字符串,可以使用替換。 3.想要按照指定的方式變成多個字符串,可以使用切割。 4.想要拿到符合要求的字符串字串,可以使用獲取。 思路: 1.可以先將“.”去掉。 2.再將多個重復內容變成單個內容。 class Demo {public static void main(String []args) throws Exception{String str = "我我.....我我........我要.......要要......要要.......學學.....學學......編編.....程....程程.....程.....程";System.out.println(str);str = str.replaceAll("\\.+","");System.out.println(str);str = str.replaceAll("(.)\\1+","$1");System.out.println(str);} }
練習:將ip地址進行順序的排序。 192.168.1.254 102.49.23.1310.10.10.10 2.2.2.2 8.109.90.30 思路: 1.按照每一段需要的最多的“0”進行補齊,那么每一段就會至少保證有3位。 2.將每一段只保留3位,這樣,所有的ip地址都是每一段3位。 import java.util.*; class Demo {public static void main(String []args) throws Exception{String str = "192.168.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";str = str.replaceAll("(\\d+)","00$1");str = str.replaceAll("0*(\\d{3})","$1");String[] arr = str.split(" ");TreeSet<String> ts = new TreeSet<String>();for(String s : arr){ts.add(s);}for(String s : ts){s = s.replaceAll("0*(\\d+)","$1");System.out.println(s);}} }
練習:對郵件地址進行校驗。 import java.util.*; class Demo {public static void main(String []args) throws Exception{String mail = "abc123@sina.com";String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+";System.out.println(mail.matches(reg));} }
常見校驗格式: [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+(較為精確),簡寫:[\\w_]+@[\\w_]+(\\.[\\D&&\\w]+)+。
練習:網頁爬蟲 import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.util.regex.*; class DemoIE {private Frame f;private TextField tf;private Button b;private TextArea ta;private Dialog d;private Label l;DemoIE(){init();}public void init(){f = new Frame("MyIE");f.setBounds(400,150,700,500);f.setLayout(new FlowLayout());tf = new TextField(70);f.add(tf);b = new Button("轉到");f.add(b);ta = new TextArea();ta.setRows(26);ta.setColumns(78);f.add(ta);d = new Dialog(f,"提示");d.setBounds(500,300,300,100);d.setLayout(new FlowLayout());f.setVisible(true);myEvent();}public void myEvent(){f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});tf.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){if(e.getKeyCode()==KeyEvent.VK_ENTER){load();}}});b.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){load();}});}public void load(){ta.setText("");try{String str = tf.getText();//URL url = new URL(new String(str));//String host = url.getHost();//int port = url.getPort();//if(port == -1)// port = 80;//String file = url.getFile();if(!str.startsWith("http://"))str = "http://"+str;URL url = new URL(str);//"http://"+host+":"+port+"//"+file);String host = url.getHost();int port = url.getPort();if(port == -1)port = 80;String file = url.getFile();url = new URL("http://"+host+":"+port+"//"+file);URLConnection conn = url.openConnection();BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;while((line = br.readLine())!=null){Pattern p = Pattern.compile("[\\w_]+@[\\w_]+(\\.[\\D&&\\w]+)+");Matcher m = p.matcher(line);while(m.find()){ta.append(m.group()+"\r\n");}}}catch(Exception e){System.out.println("nono");}}public void showDia(String info){l.setText(info);d.setVisible(true);}public static void main(String []args){new DemoIE();} }
1.匹配:matches方法,用規則匹配整個字符串,只有不符合規則,匹配結束,返回false。
練習:手機號判斷。只有13XXX,15XXX,18XXX。
class Demo {public static void main(String []args) throws Exception{String tel = "15508888888";String regex = "[1][358][0-9]{9}";if(tel.matches(regex))System.out.println("ok");elseSystem.out.println("sorry");} }2.切割:split方法。 class Demo {public static void main(String []args) throws Exception{String name = "zhangsan lisi wangwu";String regex = " +";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
注:“.”是特殊符號,“\.”又是正則表達式,所以要想表示一個“.”符號必須轉義——“\\.”。“\”也是特殊字符,所以表示一個“\”也必須轉義——“\\”。 例: class Demo {public static void main(String []args) throws Exception{String name = "Demo.java";String regex = "\\.";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
例: class Demo {public static void main(String []args) throws Exception{String name = "c:\\abc\\a.txt";String regex = "\\\\";//一個"\"只轉義一個"\"String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
練習:切疊詞。 為了讓規則結果被重用,可以將規則封裝成一個組,用“()”完成。組的出現都有編號,從1開始。要使用已有的組,可以通過“\n”(n代表組編號)的形式獲取。 class Demo {public static void main(String []args) throws Exception{String name = "dsadakkkhdeezooo";String regex = "(.)\\1+";String[] arr= name.split(regex);for(String s : arr){System.out.println(s);}} }
3.替換:replaceAll方法。 練習:將字符串中出現5次的數字換成“#”號。 class Demo {public static void main(String []args) throws Exception{String str = "asfasf46366ffaso9qw899";String regex = "\\d{5,}";str = str.replaceAll(regex,"#");System.out.println(str);} }
練習:將疊詞替換成“#”號。 class Demo {public static void main(String []args) throws Exception{String str = "wkkidssrvjjjyt";System.out.println(str);String regex = "(.)\\1+";str = str.replaceAll(regex,"#");System.out.println(str);} }
練習:將疊詞替換成單個字符。“$”獲取組里的元素。 class Demo {public static void main(String []args) throws Exception{String str = "wkkidssrvjjjyt";System.out.println(str);String regex = "(.)\\1+";str = str.replaceAll(regex,"$1");System.out.println(str);} }
4.獲取:將字符串中符合規則的字串取出。 操作步驟: 1.將正則表達式封裝成對象。 2.讓正則對象和要操作的字符串相關聯。 3.關聯后獲取正則匹配引擎。 4.通過引擎對符合規則的字串進行操作,比如取出。 java.util.regex:正則包。 Pattern:正則對象。 練習:將不超過三個字母的單詞取出。 import java.util.regex.*; class Demo {public static void main(String []args) throws Exception{String str = "ming tian jiu yao fang jia le,da jia.";//"\b"為單詞邊界匹配器String regex = "\\b[a-z]{1,3}\\b";//將規則封裝成對象Pattern p = Pattern.compile(regex);//讓正則對象和要作用的字符串相關聯,獲取匹配器對象。Matcher稱為引擎或匹配器。Matcher m = p.matcher(str);while(m.find()){System.out.println(m.group());}} }
其實,String類中的matches方法,用的就是Pattern和Matcher對象來完成的,只不過被String的方法封裝后,用起來較為簡單,但是功能單一。 容易疏忽的地方: import java.util.regex.*; class Demo {public static void main(String []args) throws Exception{String str = "jiu yao fang jia le,da jia.";String regex = "\\b[a-z]{1,3}\\b";Pattern p = Pattern.compile(regex);Matcher m = p.matcher(str);System.out.println(m.matches());while(m.find()){System.out.println(m.group());}} }
jiu也滿足了條件,可是卻沒有打印出來,這是神馬呢? 答:和Iterator的hasNext一樣,m.matches();已經將指針(索引)往后移了一位。所以也就沒有打印jiu。 練習:將下列字符串轉成:我要學編程。 我我.....我我........我要.......要要......要要.......學學.....學學......編編.....程....程程.....程.....程 到底用四種功能中的哪一種呢?或者哪幾個呢?
思考方式: 1.如果只想知道該字符串是對是錯,可以使用匹配。 2.想要將已有的字符串變成另一個字符串,可以使用替換。 3.想要按照指定的方式變成多個字符串,可以使用切割。 4.想要拿到符合要求的字符串字串,可以使用獲取。 思路: 1.可以先將“.”去掉。 2.再將多個重復內容變成單個內容。 class Demo {public static void main(String []args) throws Exception{String str = "我我.....我我........我要.......要要......要要.......學學.....學學......編編.....程....程程.....程.....程";System.out.println(str);str = str.replaceAll("\\.+","");System.out.println(str);str = str.replaceAll("(.)\\1+","$1");System.out.println(str);} }
練習:將ip地址進行順序的排序。 192.168.1.254 102.49.23.1310.10.10.10 2.2.2.2 8.109.90.30 思路: 1.按照每一段需要的最多的“0”進行補齊,那么每一段就會至少保證有3位。 2.將每一段只保留3位,這樣,所有的ip地址都是每一段3位。 import java.util.*; class Demo {public static void main(String []args) throws Exception{String str = "192.168.1.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";str = str.replaceAll("(\\d+)","00$1");str = str.replaceAll("0*(\\d{3})","$1");String[] arr = str.split(" ");TreeSet<String> ts = new TreeSet<String>();for(String s : arr){ts.add(s);}for(String s : ts){s = s.replaceAll("0*(\\d+)","$1");System.out.println(s);}} }
練習:對郵件地址進行校驗。 import java.util.*; class Demo {public static void main(String []args) throws Exception{String mail = "abc123@sina.com";String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+";System.out.println(mail.matches(reg));} }
常見校驗格式: [a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+(較為精確),簡寫:[\\w_]+@[\\w_]+(\\.[\\D&&\\w]+)+。
練習:網頁爬蟲 import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; import java.util.regex.*; class DemoIE {private Frame f;private TextField tf;private Button b;private TextArea ta;private Dialog d;private Label l;DemoIE(){init();}public void init(){f = new Frame("MyIE");f.setBounds(400,150,700,500);f.setLayout(new FlowLayout());tf = new TextField(70);f.add(tf);b = new Button("轉到");f.add(b);ta = new TextArea();ta.setRows(26);ta.setColumns(78);f.add(ta);d = new Dialog(f,"提示");d.setBounds(500,300,300,100);d.setLayout(new FlowLayout());f.setVisible(true);myEvent();}public void myEvent(){f.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0);}});tf.addKeyListener(new KeyAdapter(){public void keyPressed(KeyEvent e){if(e.getKeyCode()==KeyEvent.VK_ENTER){load();}}});b.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){load();}});}public void load(){ta.setText("");try{String str = tf.getText();//URL url = new URL(new String(str));//String host = url.getHost();//int port = url.getPort();//if(port == -1)// port = 80;//String file = url.getFile();if(!str.startsWith("http://"))str = "http://"+str;URL url = new URL(str);//"http://"+host+":"+port+"//"+file);String host = url.getHost();int port = url.getPort();if(port == -1)port = 80;String file = url.getFile();url = new URL("http://"+host+":"+port+"//"+file);URLConnection conn = url.openConnection();BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;while((line = br.readLine())!=null){Pattern p = Pattern.compile("[\\w_]+@[\\w_]+(\\.[\\D&&\\w]+)+");Matcher m = p.matcher(line);while(m.find()){ta.append(m.group()+"\r\n");}}}catch(Exception e){System.out.println("nono");}}public void showDia(String info){l.setText(info);d.setVisible(true);}public static void main(String []args){new DemoIE();} }
總結
以上是生活随笔為你收集整理的java----正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MTK6577+Android烧录
- 下一篇: 几个在线的web代理