日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java----正则表达式

發布時間:2023/12/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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方法,用的就是PatternMatcher對象來完成的,只不過被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也滿足了條件,可是卻沒有打印出來,這是神馬呢? :和IteratorhasNext一樣,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----正则表达式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。