package com.sy.grasp;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
/*String [] fakeFileData ={
"justin/t64/5/26/t09323432434/t4546465",
"momor/t68/7/23/t43543653/t34535435"
};
for(String data : fakeFileData){
String[] tokens=data.split("/t");
for(String token:tokens){
System.out.print(token+"/t|");
}
System.out.println();
}
* 显示结果:
* justin |64/5/26 |09323432434 |4546465 |
momor |68/7/23 |43543653 |34535435 |
* */
/*String text="abcdebcadxbc";
String[] tokens=text.split(".bc");
for(String token:tokens){
System.out.print(token+" ");
}
System.out.println();
tokens=text.split("..cd");
for(String token:tokens){
System.out.print(token+" ");
}
System.out.println();
* 返回结果是:
* d ad
ebcadxbc
解释:使用.bc来作比对,由于符合的子字符串有abc ebc xbc 3个,所以split()方法会使用这三个字符串来做字符串分离
,返回的就是不符合表达式.bc的d和ad了,同理..cd
* */
/*BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
System.out.println("abcdefgabcabc".replaceAll(".bc", "###"));
String phoneEL="[0-9]{4}-[0-9]{6}";
String urlEL="<a.+href*=*['/"]?.*?['/"]?.*?>";
String emailEL="^[_a-z0-9-]+(.[_a-z0-9-]+)*"+
"@[a-z0-9-]+([.][a-z0-9-]+)*$";
System.out.print("输入手机号码:");
String input=reader.readLine();
if(input.matches(phoneEL)){
System.out.println("格式正确!");
}else
System.out.println("格式不正确!");
System.out.print("输入href标签:");
input=reader.readLine();
if(input.matches(urlEL)){
System.out.println("格式正确!");
}else
System.out.println("格式不正确!");
System.out.print("输入Email标签:");
input=reader.readLine();
if(input.matches(emailEL)){
System.out.println("格式正确!");
}else
System.out.println("格式不正确!");
执行结果:
* ###defg######
输入手机号码:0791-7143391
格式不正确!
输入href标签:http:
格式不正确!
输入Email标签:sy_anhui@sina.com
格式正确!
* 0791-7143391格式不正确,原因是后面是6位数字。
* */
/* String phones1="Justin的手机号码:0939-100391/n"+
"Moda的手机号码:0939-324341/n";
Pattern pattern=Pattern.compile(".*0939-//d{6}");
Matcher matcher=pattern.matcher(phones1);
while(matcher.find()){
System.out.println(matcher.group());
}
String phones2="sunyuan的手机号:1233-342424/n"+
"bush的手机号:0939-344125";
matcher=pattern.matcher(phones2);
while(matcher.find()){
System.out.println(matcher.group());
}
* 执行结果:
* Justin的手机号码:0939-100391
Moda的手机号码:0939-324341
bush的手机号:0939-344125
* */
String text="abcdebcadxbc";
Pattern pattern=Pattern.compile(".bc");
Matcher matcher=pattern.matcher(text);
while(matcher.find()){
System.out.println(matcher.group());
}
System.out.println();
/*执行结果:
* abc
ebc
xbc
* */
/*
* 下面简介一下Pattern和Matcher
* String上可以使用正则表达式的操作,实际上是利用了java.util.regex.Pattern与
* java.util.regex.Matcher的功能。当调用String的matches()方法时,实际上是调用Pattern
* 的静态方法matches(),这个方法会返回boolean值,表示字符串是否符合正则表达式。
* 如果想要将正则表达式视为一个对象来重复使用,可以使用Pattern的静态方法complie()
* 方法进行编译,complie()方法会返回一个Pattern 的实例,这个实例
* 代表正则表达式,之后就可以重复使用Pattern的实例的matcher()方法
* 来返回一个Matcher的实例,代表符合正则式的实例,这个实例上有一些寻找符合正则式条件的方法可供操作。
*
* */
}
}
、下面总结一下基本的正则表达式的meta character以及它们含义:
. 匹配任意一个字符 $ 匹配一行的结尾 ^ 匹配一行的开头(在[]里面表示否定)
{} 定义了一个范围 [] 定义了一个字符类 () 定义了一个组
*前面出现0次以上 + 前面匹配一次以上 ?前面出现0次或一次
/ 后面的字符不会看作metacharacter /w 字母数字下划线 /W 非字母数字下划线
/d 单个数字 /D单个非数字 | 或,二者之一 &&与操作符 /b单词边界
下面看看几个简单的例子:
[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](减去)