注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

程序员小站

J2EE丨Spring | JVM | Scala

 
 
 

日志

 
 

正则表达式(三)-标记化字符串  

2012-04-18 12:04:13|  分类: java技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

标记化一个字符串,是每一个程序员都曾面临的编程任务之一,标记化是将字符串分解成它的各个部分的过程,这些部分称为标记(token),标记化就是把字符串分割成最小的不可分割的单元。
例如一个字符串包括关键字、标示符、运算符、分隔符等。我们要从字符串中抽取各自的信息。
标记化字符串有两种基本的方法:
1.基于分隔符:按固定格式排列的字符串,可以简单的通过spit方法来将这个字符串分割成单独的标记
2.基于匹配的模式:就是我们要讲的正则表达式。
由于标记化是一个很重要的任务,java API提供了大量的内置支持。
1)StreamTokenizer、2)Scanner 、3)StringTokener(已过时)
String s = "The first is a hammer, with a cost of $123.45";
StreamTokenizer st = new StreamTokenizer(new StringReader(s));
do{
int i = st.nextToken();
if(i == StreamTokenizer.TT_EOF){ //结束
System.out.println("结束");
break;
}
if(i == StreamTokenizer.TT_NUMBER){ //数字
System.out.println("number");
}
if(i == StreamTokenizer.TT_WORD){ //单词
System.out.println("word");
}

}while(true);
java提供的类支持只能提供简单的匹配,接下来我们通过正则表达式进行匹配。
使用正则式API标记化字符串的关键之处是“\G”边界匹配器。它的作用是从前一个匹配的结尾处开始匹配。
Matcher的方法usePattern(Pattern newPattern) 用于更改Pattern
几个常用的正则式示例:
 匹配模式
 单词\G\p{Aplha}
 标点符号\G\p{Punct}
 空白符\G\s+
 数字 \G\d+\.?\d+*
 结束 \G\z
另一个比较重要的就是匹配的顺序,比如"<=" 要先匹配"\G[(<=)|(>=)]"再匹配"\G[<>=!]" 否则会拆分为“<”和“=”,原则就是先匹配整体,再匹配部分。
接下来我们匹配一个字符串的标点单词和数字:

static Pattern end = Pattern.compile("\\G\\z"); //匹配结束返回""
static Pattern word = Pattern.compile("\\G\\w+"); //匹配单词
static Pattern punct = Pattern.compile("\\G\\p{Punct}"); //标点
static Pattern space = Pattern.compile("\\G\\s"); //空格
static Pattern number = Pattern.compile("\\G\\d+\\.?\\d+"); //数字

public static String getTextTokenizer(Matcher mat){
//首先忽略空白符
mat.usePattern(space);
mat.find();

//是否是数字
mat.usePattern(number);
if(mat.find()) return mat.group();

//是否是单词
mat.usePattern(word);
if(mat.find()) return mat.group();

//是否是标点
mat.usePattern(punct);
if(mat.find()) return mat.group();

//查看是否是结束符
mat.usePattern(end);
if(mat.find()) return mat.group();

return null;
}
public static void main(String[] args) {
String token = "";
Matcher mat = end.matcher("The first is a hammer, with a cost of $123.45");
do{
token = getTextTokenizer(mat);
if(token == null){
System.out.println("失败");
break;
}
if(token.length() != 0){
System.out.println("Token : "+token);
}else{
System.out.println("结束");
}

}while(token.length() != 0);
}


输出:

Token : The
Token : first
Token : is
Token : a
Token : hammer
Token : ,
Token : with
Token : a
Token : cost
Token : of
Token : $
Token : 123.45
结束

  评论这张
 
阅读(350)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017