java nextintln_Java对正则表达式的支持(二)
正則表達式的主要用途:
a.在目標字符串中找出匹配正則表達式的部分
b.校驗目標字符串是否符合正則表達式,例如校驗郵箱地址
c.在目標字符串中替換符合正則表達式的部分為其他的字符串
Scanner類是JDK 1.5中引入的掃描類,Scanner類的構造函數可以接受一個Readable對象,具體說來可以是File、String、InputStream等。
下面是一個Scanner類配合正則表達式使用的例子,目的是找出以S、s、c、t開頭的單詞。
packageRegexTest;importjava.io.File;importjava.io.FileNotFoundException;importjava.util.Scanner;importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classScannerTest {public static void main(String [ ] args) throwsFileNotFoundException {
Pattern pa= Pattern.compile("\\b[Ssct]\\w+");
Matcher ma= pa.matcher("");
Scanner sc= new Scanner(new File("src/RegexTest/ScannerTest.java"));while(sc.hasNextLine()){
ma.reset(sc.nextLine());while(ma.find()){
System.out.println(ma.group());
}
}
}
}
輸出結果為:
ScannerclassScannerTeststaticStringthrowscompile
Ssct
Scanner
sc
Scanner
src
ScannerTest
sc
sc
System
正則表達式"\\b[Ssct]\\w+"的含義如下,\b表示單詞的邊界,使用正則表達式操作單詞時需要使用\b。w代表的是0-9或者a-z或者A-Z。
sc.hasNextLine()可以判斷Scanner是否能取到下一行,sc.nextLine()是取下一行的字符串。
Scanner還有hasNextInt()、hasNextLong()、hasNextBigInteger()等方法用于取出下一個基本類型。
Scanner默認地是根據空格來分割輸入的字符串,也可以自定義分割符,如下面所示。
importjava.util.Scanner;public classScannerTest2 {public static voidmain(String [ ] args) {
String str= "12,42 , 78 ,99, 42";
Scanner sc= newScanner(str);
sc.useDelimiter("\\s*,\\s*");while(sc.hasNextInt()){
System.out.println(sc.nextInt());
}
}
}
輸出結果為:
12
42
78
99
42
sc.useDelimiter("\\s*,\\s*");中的\s代表空白符(空格,回車,換行等),*代表一個或多個,合起來就是“,”前后帶任意個空白符。
Scanner除了可以配合Pattern和Matcher使用外,其本身也是支持正則表達式的,如下面的例子。
packageRegexTest;importjava.util.Scanner;importjava.util.regex.MatchResult;importjava.util.regex.Matcher;importjava.util.regex.Pattern;public classScannerTest3 {public static voidmain(String [ ] args) {
String str= "58.77.82.161@02/10/2012\n" +
"204.17.82.31@02/11/2012\n" +
"58.77.32.53@02/12/2012\n" +
"28.45.32.161@02/12/2012\n";
Scanner sc= newScanner(str);
String pattern= "(\\d+\\.\\d+\\.\\d+\\.\\d+)@"+
"(\\d{2}/\\d{2}/\\d{4})";while(sc.hasNext(pattern)){
sc.next(pattern);
MatchResult mr=sc.match();
String ip= mr.group(1);
String date= mr.group(2);
System.out.format("Threat on %s from %s\n",date,ip);
}
Pattern pa= Pattern.compile("(\\d+\\.\\d+\\.\\d+\\.\\d+)@"+
"(\\d{2}/\\d{2}/\\d{4})",Pattern.CASE_INSENSITIVE |Pattern.MULTILINE);
Matcher matcher=pa.matcher(str);while(matcher.find()){
String ip= matcher.group(1);
String date= matcher.group(2);
System.out.format("Threat on %s from %s\n",date,ip);
}
}
}
輸出結果為:
Threat on 02/10/2012 from 58.77.82.161Threat on02/11/2012 from 204.17.82.31Threat on02/12/2012 from 58.77.32.53Threat on02/12/2012 from 28.45.32.161Threat on02/10/2012 from 58.77.82.161Threat on02/11/2012 from 204.17.82.31Threat on02/12/2012 from 58.77.32.53Threat on02/12/2012 from 28.45.32.161
下面是一個將IP地址進行排序的例子,如下:
packageregExp;importjava.util.Arrays;public classSortIPAddressWithRegExp {public static voidmain(String[] args) {
String ip= "102.49.25.254 102.49.23.13 10.10.10.10 2.2.2.2 8.109.90.30";//先對IP每一位都添加兩個0
String regex = "(\\d+)";
ip= ip.replaceAll(regex,"00$1");
System.out.println(ip);//再將IP地址只保留三位
regex = "0*(\\d{3})";
ip= ip.replaceAll(regex,"$1");
System.out.println(ip);//下面進行切割
String[] result = ip.split(" +");
System.out.println(Arrays.asList(result));
Arrays.sort(result);
System.out.println("after");for(int i =0;i
result[i]=result[i].replaceAll("0*(\\d+)","$1"); //將前面的0 去掉
for(String s : result)
System.out.println(s);
}
}
使用正則表達式判斷文件中是否含有中文字符的例子為:
importjava.io.File;importjava.io.FileNotFoundException;importjava.util.Scanner;importjava.util.regex.Pattern;public classCheckChineseCharacter {public static void main(String[] args) throwsFileNotFoundException {
Scanner sc= new Scanner(new File("UCS_PM_1.1.5_EN.sql"));
String str= "";int index = 1;while(sc.hasNextLine()){
str=sc.nextLine();if(isChinese(str)){
System.out.println(str+ "contain Chinese Character");
}else{
System.out.println("no Chinese Character in cloum " +index);
}
index++;
}
}//根據Unicode編碼判斷中文漢字和符號
private static boolean isChinese(charc) {
Character.UnicodeBlock ub=Character.UnicodeBlock.of(c);if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub ==Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub ==Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub ==Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS|| ub ==Character.UnicodeBlock.GENERAL_PUNCTUATION) {return true;
}return false;
}//完整的判斷中文漢字和符號
public static booleanisChinese(String strName) {char[] ch =strName.toCharArray();for (int i = 0; i < ch.length; i++) {char c =ch[i];if(isChinese(c)) {return true;
}
}return false;
}//只能判斷部分CJK字符(CJK統一漢字)
public static booleanisChineseByREG(String str) {if (str == null) {return false;
}
Pattern pattern= Pattern.compile("[\\u4E00-\\u9FBF]+");returnpattern.matcher(str.trim()).find();
}//只能判斷部分CJK字符(CJK統一漢字)
public static booleanisChineseByName(String str) {if (str == null) {return false;
}//大小寫不同:\\p 表示包含,\\P 表示不包含//\\p{Cn} 的意思為 Unicode 中未被定義字符的編碼,\\P{Cn} 就表示 Unicode中已經被定義字符的編碼
String reg = "\\p{InCJK Unified Ideographs}&&\\P{Cn}";
Pattern pattern=Pattern.compile(reg);returnpattern.matcher(str.trim()).find();
}
}
總結
以上是生活随笔為你收集整理的java nextintln_Java对正则表达式的支持(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM 学习二:类加载器子系统
- 下一篇: linux内核多大 4.17.8,Lin