正则表达式及字符串的替换与分解
1、正则表达式
一个正则表达式含有一些具有特殊意义字符·的字符串,这些特殊的字符串称为正则表达式中的元字符。
eg: "dcat"中的\\d就是有特殊意义的字符串,代表0—9中的任意一个,即"0cat" 、“1cat”、“2cat”、、、都与之匹配
字符串对象调用public boolean match(String regex)方法可以判断当前字符串对象和参数regex指定的正则表达式匹配。
正则表达式中可以用括号括起若干个字符来表示一个元字符,改元字符代表方括号中的任何一个字符。eg:“[159]ABC”, 那么“1ABC”,“5ABC”,“9ABC”都是 和“[159]ABC”匹配的字符串。
[abc];代表a、b、c中的任何一个;
[^abc]:代表除了a、b、c以外的任何字符;
[a-zA-Z];代表英文字母(包括大小写)中的任何一个;
[a-d]:代表a至d中的任何一个。
注意:
a、中括号里允许嵌套中括号,可以进行并、交、差运算。
b、由于“."代表任何一个字符吗,所以在正则表达式中必须用[.]或\56表示任意一个普通字符。
c、使用限定修饰符。X?、X*、X+、X{n}、X{n,}、X{n,m}、XY、X|Y
eg:regex="@\\w{4}",那么“@abcd”,“@天道酬勤”,"@Java"和“@bird”都是与正则表达式regex匹配的字符串。
import java.util.Scanner;
public class Example1 {
public static void main(String[] args) {
String regex="[a-zA-Z]+";
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
if(str.matches(regex)){
System.out.println(str+"中的字符都是英文字母");
}
}
}
2、字符串的替换
字符串对象调用public String replaceAll(String regex,String replacement)方法返回一个字符串,该字符串是将当前字符串中所有和参数regex指定的正则表达式匹配的子字 符串用参数replacement指定的字符串替换后的字符串,
eg:String s=“12hello567bird”.replaceAll("[a-zA-Z]+","你好");
s=“12你好567”;
注意:当前字符串调用replaceAll()方法返回一个字符串,但不改变当前字符串。
3.字符串的分解
JDK1.4后,String类提供了一个实用的方法public String[] split(String regex),字符串调用该方法时,使用参数指定上的正则表达式regex作为分隔标记符分解出其中的单 词,并将分解出的单词放到字符数组中。
eg:String str=“1949年10月1日是中华人民共和国成立的日志”;
如果用正则表达式String regex=“\\D+”作为分隔标记,则可得到由数字组成的单词。
String digitWord[]=str.split(regex);
didgitWord[0] 、digitWord[1] 、digitWord[2]就分别是“1949”、“10”和“1”
4、StringTokenizer类
和split方法不同的是,StringTokenizer对象不使用正则表达式作为分隔标记。
有时需要分析字符串并将字符串分解成可被独立使用的单词,这些单词叫做语言符号。
StringTokenizer类有两个构造方法:
StringTokenizer(String s):为字符串构造一个分析器。默认是空格作为分隔符,即空格符(若干个空格被看成做一个空格)、换行符、回车符、Tab符、进纸符做分隔标记。
StringTokenizer(String s,String delim):参数delim被指定为分隔符
一个StringTokenizer对象为一个字符串分析器,一个分析器可以使用nextToken()方法逐个获取语言符号(单词),调用nextToken()时,获得下一个语言符号。
调用StringTokenizer类中的hasMoreTokens()方法可以判断字符串中是否还含有语言符号,调用countTokenizer()方法可得到分析器中计数变量的值。
5、Scanner类
(1)、使用默认分隔符解析字符串
创建Scanner对象,并将要解析的字符串传递给所构造的对象;
eg:String NBA=“I love this game”;
为了解析出NBA中的单词,可以构造如下一个Scanner对象。
Scanner scanner=new Scanner(NBA);
那么scanner将空格作为分隔标记来解析字符串中的单词:
a、scanner调用next()方法依次返回NBA中的单词,如果最后一个单词已被返回,则scanner调用hasNext()方法将返回false;否则返回true。
b、对于解析字符串中的数字型单词,scanner调用nextInt()或nextDouble()方法来代替next(),即scanner()可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double型。
public class Example2 {
public static void main(String[] args) {
String cost="TV cost 876 dollar.Computer cost 2398 dollar.telephone cost 1278 dollar";
Scanner scanner=new Scanner(cost);
double sum=0;
while(scanner.hasNext()){
try{
double price=scanner.nextDouble();
sum=sum+price;
System.out.println(price);
}catch(InputMismatchException exp){
String t=scanner.next();
}
}
System.out.println("总消费:"+sum+"元");
}
(2)使用正则表达式作为分隔标记解析字符串
useDelimiter(正则表达式);
将正则表达式作为分隔标记,即Scanner对象在解析字符串时,把与正则表达式匹配的字符串作为分隔标记。
import java.util.Scanner
public class Example3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String cost="话费清单:市话费76.89元,长途话费:167.38元,短信费12.68元";
Scanner scanner=new Scanner(cost);
scanner.useDelimiter("[^0123456789.]+");//Scanner对象默认采用空格做分隔符
double sum=0;
while(scanner.hasNext()){
try{
double price=scanner.nextDouble();
sum=sum+price;
System.out.println(price);
}catch(InputMismatchException exp){
String t=scanner.next();
}
}
System.out.println("总费用:"+sum);
}
}
6、Pattern与Matcher类
模式匹配就是检索和指定模式匹配的字符串。Java提供了专门用来进行模实匹配的Pattern类和Matcher类,这些类在java.util.regex包中。
1、建立模式对象
使用正则表达式regex做参数得到一个成为模式的Pattern类的实例pattern
Pattern pattern=Pattern.compile(regex);
eg: String regex="good";
pattern=Pattern.compile(regex);
模式对象是对正则表达式的封装。Pattern类调用类方法compile(String regex)返回一个模式对象,其中参数regex是一个正则表达式,称为模式对象使用的模式。Pattern类可以调用complie(String regex,int flags)返回一个Pattern对象。
2、得到匹配对象
得到可以检索字符串的input的Matcher类的实例matcher(匹配对象)。
Matcher matcher=pattern.matcher(input);
模式对象patter调用matcher(CharSequence input)方法返回一个Matcher对象matcher,称为匹配对象,参数input用于给出matcher要检索上的字符串。要求:参数必须是实现了CharSequence接口的对象。
匹配对象matcher就可以调用各种方法检索字符串input,
eg:a、public boolean find():寻找input和regex匹配的下一子序列,如果匹配成功返回true,否则返回flase。首次调用该方法时,寻找input中第1个和regex匹配的子序列,如果find()返回true,matcher再次调用find()方法时,就会从上一次匹配模式成功的子序列后开始寻找下一个匹配模式的子序列。
b、public boolean matches():matcher调用该方法判断input是否完全和regex匹配。
c‘、其他相关方法:
public boolean lookingAt(),
public boolean find(int start),
public String replaceAll(String replacement),
publicString replaceFirst(String replacement)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pattern p;
Matcher m;
String regex="(http://|www)56?\\w+\56{1}\\w+\56{1}\\p{Alpha}+";
p=Pattern.compile(regex);
String s="新浪:www.sina.cn,央视:http://www.cctv.com";
m=p.matcher(s);
while(m.find())
{
String str=m.group();
System.out.println(str);
}
System.out.println("剔除字符串中的网站地址后得到的字符串:");
String result=m.replaceAll("");//matcher()调用该方法可以返回一个字符串,该字符串是通过把input中与模式regex匹配的字符串全部替换成参数replacement指定的字符串得到的
System.out.println(result);
}
}