正则表达式的主要用途:

  a.在目标字符串中找出匹配正则表达式的部分

  b.校验目标字符串是否符合正则表达式,例如校验邮箱地址

  c.在目标字符串中替换符合正则表达式的部分为其他的字符串

  Scanner类是JDK 1.5中引入的扫描类,Scanner类的构造函数可以接受一个Readable对象,具体说来可以是File、String、InputStream等。

  下面是一个Scanner类配合正则表达式使用的例子,目的是找出以S、s、c、t开头的单词。 

package RegexTest;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class ScannerTest { public static void main(String [ ] args) throws FileNotFoundException {
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());
}
}
} }

  输出结果为:

Scanner
class
ScannerTest
static
String
throws
compile
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默认地是根据空格来分割输入的字符串,也可以自定义分割符,如下面所示。

import java.util.Scanner;

public class ScannerTest2 {

    public static void main(String [ ] args) {
String str = "12,42 , 78 ,99, 42"; Scanner sc = new Scanner(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使用外,其本身也是支持正则表达式的,如下面的例子。 

package RegexTest;

import java.util.Scanner;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class ScannerTest3 { public static void main(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 = new Scanner(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.161
Threat on 02/11/2012 from 204.17.82.31
Threat on 02/12/2012 from 58.77.32.53
Threat on 02/12/2012 from 28.45.32.161
Threat on 02/10/2012 from 58.77.82.161
Threat on 02/11/2012 from 204.17.82.31
Threat on 02/12/2012 from 58.77.32.53
Threat on 02/12/2012 from 28.45.32.161

  下面是一个将IP地址进行排序的例子,如下:

package regExp;

import java.util.Arrays;

public class SortIPAddressWithRegExp {

    public static void main(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.length;i++)
result[i]=result[i].replaceAll("0*(\\d+)","$1"); // 将前面的0 去掉
for(String s : result)
System.out.println(s);
} }

  使用正则表达式判断文件中是否含有中文字符的例子为:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.regex.Pattern; public class CheckChineseCharacter {
public static void main(String[] args) throws FileNotFoundException {
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(char c) {
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 boolean isChinese(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 boolean isChineseByREG(String str) {
if (str == null) {
return false;
}
Pattern pattern = Pattern.compile("[\\u4E00-\\u9FBF]+");
return pattern.matcher(str.trim()).find();
} // 只能判断部分CJK字符(CJK统一汉字)
public static boolean isChineseByName(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);
return pattern.matcher(str.trim()).find();
}
}

Java对正则表达式的支持(二)的更多相关文章

  1. Java对正则表达式的支持(一)

    Java对正则表达式的支持主要体现在String.Pattern.Matcher和Scanner类. 1.Pattern.Matcher 先看一个Pattern和Matcher类使用正则表达式的例子. ...

  2. Java正则速成秘籍(二)之心法篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  3. Java从零开始学三十二(正则表达式)

    一.为什么要有正则 正则表达式可以方便的对数据进行匹配,可以执行更加复杂的字符串验证.拆份.替换功能. 例如:现在要求判断一个字符串是否由数字组成,则可以有以下的两种做法: 不使用正则完成 使用正则完 ...

  4. java基础---->java中正则表达式二

    跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下 ...

  5. JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\)

    JS和PHP和JAVA的正则表达式的区别(java没有分解符,java中的转义字符是\\) 一.总结 js正则:var patrn=/^[0-9]{1,20}$/; php正则:$pattern='/ ...

  6. 史上最全最新java面试题合集二(附答案)

    下面小编整理了本套java面试题全集,分享给大家,希望对大家的java学习和就业面试有所帮助. 51.类ExampleA继承Exception,类ExampleB继承ExampleA. 有如下代码片断 ...

  7. Java中正则表达式的使用(常用的方法)

    这两天回想了一下正则表达式的使用,顺便就总结了一下java的javascript中使用正则表达式的用法,需要看javascript中使用正则的朋友可以看我的另一篇总结,下面我就简单的介绍一下java中 ...

  8. java中正则表达式基本用法

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  9. Java与正则表达式

    Java与正则表达式 标签: Java基础 正则 正如正则的名字所显示的是描述了一个规则, 通过这个规则去匹配字符串. 学习正则就是学习正则表达式的语法规则 正则语法 普通字符 字母, 数字, 汉字, ...

随机推荐

  1. [HDU3247]Resource Archiver

    AC自动机+状压DP 首先对所有串建AC自动机,然后对于每个资源串,算出从串末走到其他资源串末所需的距离(中途避开非法点) 也就是算出两两间的距离...然后就变成旅行商问题了. 计算距离的时候要考虑一 ...

  2. codeforce 367dev2_c dp

    codeforce 367dev2_c dp 标签: dp 题意: 你可以通过反转任意字符串,使得所给的所有字符串排列顺序为字典序,每次反转都有一定的代价,问你最小的代价 题解:水水的dp...仔细想 ...

  3. (a == 1 && a == 2 && a == 3),何时为true?

    今天浏览一些技术网站,看到这个题目.虽然觉着代码这么写的可能性低之又低,但是却也考验对js了解的程度. 在 JavaScript 中 (a ==1 && a== 2 && ...

  4. Spring的IOC分析(二)源码

    承接上节继续,分析Ioc的工作原理,在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起(同时一个叫DI"依赖注入"或DL"依赖查找" ...

  5. Cxf -wsdl2java 使用参数介绍

    wsdl2java -h 可以得到详细的参考文档: G:\cxf\apache-cxf-3.1.6\bin>wsdl2java -h wsdl2java -fe|-frontend <fr ...

  6. AMD规范学习笔记

    背景 NodeJS的一套比较简洁 Moudles 规范, 使得在服务器端的模块化变得更加简单.很长一段时间,很多公司或者项目都有自己的一套模块化机制, 却未能形成一套统一的标准, NodeJS的Mou ...

  7. 如何在外部终止一个pengding的promise对象

    今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject.(具体为何会有这种需求我也不 ...

  8. LAMP环境跟LNMP环境有什么不同,主要用什么地方

    LAMP即Linux+Apache+Mysql/MariaDB+Perl/PHP/Python Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网 ...

  9. [拾 得] 一枚迷人的贝壳 SHELL / Linux | shell 脚本初步入门

    坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/   索引: 什么是shell shell的分类 shell脚本的执行方式   ...

  10. asp.net -mvc框架复习(9)-实现用户登录控制器和视图的编写并调试

    1.编写控制器 三个步骤: [1]获取数据 [2]业务处理 [3]返回数据 using System;using System.Collections.Generic;using System.Lin ...