Java正则表达式入门学习


许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。所以JAVA语言也不例外。正则表达式已经超出了某种语言或某个系统的局限,成为被人们广为使用的工具,我们完全可以用它来解决实际开发中碰到的一些实际的问题。

一、正则表达式基础知识
1.1 句点符号
假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:
1.2 方括号符号
为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:
1.3 “或”符号
如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组。
1.4 表示匹配次数的符号
下表显示了正则表达式的语法:

表 1.1 正则表达式语法

假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“/”。

假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号。

美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。
1.5 “否”符号
“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。
1.6 圆括号和空白符号
 “/s”符号是空白符号,匹配所有的空白字符,包括Tab字符。如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API提取出它的值。
1.7 其它符号
为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。如以下所示:
/t:制表符,等同于/u0009
/n:换行符,等同于/u000A
/d:代表一个数字,等同于[0-9]
/D:代表非数字,等同于[^0-9]
/s:代表换行符、Tab制表符等空白字符
/S:代表非空白字符
/w:字母字符,等同于[a-zA-Z_0-9]
/W:非字母字符,等同于[^/w]
例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“/d”。
二、以下是我整理出来的程序,供参考:

package org.luosijin.test; 
 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class Regex { 
 public static void main(String[] args) { 
  Pattern pattern = Pattern.compile("b*g"); 
  Matcher matcher = pattern.matcher("bbg"); 
  System.out.println(matcher.matches()); 
  System.out.println(pattern.matches("b*g","bbg")); 
  //验证邮政编码 
  System.out.println(pattern.matches("[0-9]{6}", "200038")); 
  System.out.println(pattern.matches("//d{6}", "200038")); 
  //验证电话号码 
  System.out.println(pattern.matches("[0-9]{3,4}//-?[0-9]+", "02178989799")); 
  getDate("Nov 10,2009"); 
  charReplace(); 
  //验证身份证:判断一个字符串是不是身份证号码,即是否是15或18位数字。 
  System.out.println(pattern.matches("^//d{15}|//d{18}$", "123456789009876")); 
  getString("D:/dir1/test.txt"); 
  getChinese("welcome to china,江西奉新,welcome,你!"); 
  validateEmail("luosijin123@163.com"); 
 } 
 /** 
  * 日期提取:提取出月份来 
  */ 
 public static void getDate(String str){ 
  String regEx="([a-zA-Z]+)|//s+[0-9]{1,2},//s*[0-9]{4}"; 
  Pattern pattern = Pattern.compile(regEx); 
  Matcher matcher = pattern.matcher(str); 
  if(!matcher.find()){ 
   System.out.println("日期格式错误!"); 
   return; 
  } 
  System.out.println(matcher.group(1)); //分组的索引值是从1开始的,所以取第一个分组的方法是m.group(1)而不是m.group(0)。 
 } 
 /** 
  * 字符替换:本实例为将一个字符串中所有包含一个或多个连续的“a”的地方都替换成“A”。 
  */ 
 public static void charReplace(){ 
  String regex = "a+"; 
  Pattern pattern = Pattern.compile(regex); 
  Matcher matcher = pattern.matcher("okaaaa LetmeAseeaaa aa booa"); 
  String s = matcher.replaceAll("A"); 
  System.out.println(s); 
 } 
 /** 
  * 字符串提取 
  */ 
 public static void getString(String str){ 
  String regex = ".+/(.+)$"; 
  Pattern pattern = Pattern.compile(regex); 
  Matcher matcher = pattern.matcher(str); 
  if(!matcher.find()){ 
   System.out.println("文件路径格式不正确!"); 
   return; 
  } 
  System.out.println(matcher.group(1)); 
 } 
 /** 
  * 中文提取 
  * @param str 
  * @author 罗嗣金 
  * @date 2009-11-10 上午12:27:17 
  */ 
 public static void getChinese(String str){ 
  String regex = "[//u4E00-//u9FFF]+";//[//u4E00-//u9FFF]为汉字 
  Pattern pattern = Pattern.compile(regex); 
  Matcher matcher = pattern.matcher(str); 
  StringBuffer sb = new StringBuffer(); 
  while(matcher.find()){ 
   sb.append(matcher.group()); 
  } 
  System.out.println(sb); 
 } 
  public static void validateEmail(String email){ 
  String regex = "[0-9a-zA-Z]+@[0-9a-zA-Z]+//.[0-9a-zA-Z]+"; 
  Pattern pattern = Pattern.compile(regex); 
  Matcher matcher = pattern.matcher(email); 
  if(matcher.matches()){ 
   System.out.println("这是合法的Email"); 
  }else{ 
   System.out.println("这是非法的Email"); 
  } 
 } 
} 

 以上就是Java正则表达式的全部内容,希望对大家的学习有所帮助



相关阅读:
PHP return语句另类用法不止是在函数中
MySQL 启动报错:File ./mysql-bin.index not found (Errcode: 13)
Win8系统如何定时运行程序?Win8系统定时运行程序的方法
jQuery鼠标悬浮链接弹出跟随图片实例代码
require.js的用法详解
CSS实现五颜六色按钮组成的导航条效果代码
1亿条记录的MongoDB数据库随机查询性能测试
将HTML的左右尖括号等转义成实体形式的两种实现方式
百度地图API应用之获取用户的具体位置
C/C++实现字符串模糊匹配
Windows8下设置蓝牙配对的操作步骤
详解MySQL的用户密码过期功能
Android开发之Button事件实现与监听方法总结
C# web api返回类型设置为json的两种方法
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 吉安-长春 安阳-广元 汨罗东-建始 衡水-定边 曲靖-分宜 南宫东-黄山 灵石-永济 民权-曹县 沧州-开原 子洲-旬阳北 即墨北-商丘 新立屯-大虎山 娄底-英德 聊城-泰和 四平-岳阳 塔哈-锦河 平顶山西-晋城 三门峡-确山 资溪-武当山 蚌埠-吐鲁番北 木里图-白音胡硕 保定-廉江 昆阳-蒙自 太平庄-通辽 民权北-阳泉北 明港东-咸宁北 眉山-杨陵 公主岭-太阳升 富裕-绥化 东来-保定 大石桥-绥化 镇江南-大连 葫芦岛北-本溪 桓龙湖-丹东 余杭-太姥山 密云北-北京 盖州-上海 彝良南-盐津 运城北-洪洞西 南河川-贺家店 定边-西安南 烟台南-海阳北 鹰潭北-湘潭北 富拉尔基-白城 蚌埠-临汾 草海-关寨 泉阳-老营 石家庄北-安康 富拉尔基-呼兰 镇赉-塔哈 全州南-长兴 庐山-衡水 旗下营-东兴 南观村-云居寺 玉田县-太平川 镇江-保定 关林-白河东 丹凤-六安 丹凤-中卫 金城江-宜州 贵阳-鹤壁 凌海-三十家 泰和-新县 佛岭-玉泉 金马村-都格 星耀-兴和 冠豸山-福州 吕梁-玉门 苏州-嘉善 厦门-潢川 彝良南-豆沙关 武安-井店 甘河-大庆 子长-包头 渑池-广安 兴和-保健 嘉兴-阳新 宜春-贵定 诸暨-唐山 瓦房店-宁陵县 哈尔滨到云南丽江做列车要多少钱
从昆明列车火车站怎样坐车到安宁
到复旦大学附属中山医院门诊看病怎样停车?
从上海南站到上大路上的上海大学怎么坐车
北京到朔州的2602次列车在那个站上车
奉贤大叶公路到龙源路乘车路线
从邯郸到佳木斯坐几次列车火车
福州有没有可以代购美丽宝鞋子的啊?!最底能打到多少折?
沧州到秦皇岛票价钱数多少钱
汉口到武穴的汽车客车,在哪里坐车是新华路的那个车站吗如果
跪求,运城的大哥大姐们,有谁知道运城中心汽车站是提前几天
武林外传冲多钱才能得到圣青龙 神葫芦 堕天使
武汉 四川游
济南到泰安过路费多少
南京市区到安徽全椒县城自行车路线,要能骑过去的那种,关乎
上海虹桥列车火车站离虹桥T2候机楼有多远,那种方式快
现在从郑州到景德镇坐飞机票价多少钱
天津到芜湖有多少公里
我从江油坐火车列车到成都,想去成都欢乐谷,该怎样在火车列车站坐公
申通邢台能到沙河吗需要几天啊
镇江中山西路客车汽车站到丹阳最早的一班车是几点啊
天津到北京的列车火车查询
现在从郑州去青岛的列车火车都是哪些时间啊,最快的是
带孩子从兰州去潍坊上学报到,顺路到曲阜、济南、烟台、青岛
请问从南安客车汽车站到南安市检察院怎么坐车(急啊)
K7374现在通车吗
长春到珲春的客车时间,地点
南充有到犀浦的动车吗?
深圳火车站T108次火车10月1日有到九江的车吗
什么公共汽车到列车站?告诉我所有能到列车站的公共汽车,我自

Copyright © 2016 phpStudy |