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 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 潍坊小商品城汽车站 青年路
故城坊庄乡汽车站 九零六县道
永川临江汽车站 重庆市永川区
穆村车站 深穆路
街关汽车站 三零七国道
兴化缸顾客运站 江苏省泰州市兴化市
绥阳客运站 黑龙江省牡丹江市东宁县
韶关曲江汽车站 马坝大道中区公安局旁
清镇市卫城镇客车站 贵州省贵阳市清镇市
江津客运中心 鼎山大道
厦门枋湖客运中心 厦门市湖里区金湖路5号
肥城潮泉客运站 山东省泰安市肥城市
琅琊客运站 四川省达州市渠县
问安镇客运站 湖北省宜昌市枝江市
济南长途汽车总站停车场 山东省济南市天桥区
松滋洈水客运站 湖北省荆州市松滋市
阜阳汽车东站候车室 安徽省阜阳市颍东区
沾化下洼客运站 山东省滨州市沾化县
封开杏花车站 广东省肇庆市封开县
大桥客运站出站口 湖北省荆州市松滋市
三阳汽车站 江西省宜春市袁州区
安平汽车站 河北省衡水市安平县
蓼都综合客运站 安徽省六安市霍邱县
彭州蒙江客运站 蒙东路13号
三台旅游汽车客运站 学林路
建瓯水南客运站 福建省南平市建瓯市
东明三春集客运站 山东省菏泽市东明县
登封市卢店汽车站 三一六省道
洞口县山门汽车站 湖南省邵阳市洞口县
文宫汽车站 四川省眉山市仁寿县
广元中子客运站 四川省广元市朝天区
西平汽车站 河南省驻马店市西平县
长途汽车站-公交车站 安徽省宣城市宁国市津河东路杨帆商都4号楼106号
恩施客运站 航空大道
南平汽车站车出口处 福建省南平市延平区
青州客运站旅客出站口 山东省潍坊市青州市
苍南钱库站 振兴东街
沧州汽车客运东站 交通南大道与新华东路交口
德清徐家庄车站 浙江省湖州市德清县
珠海岐关车站 南湾大道
南昌长途汽车总站 八一大道199号
象州县汽车总站石龙客运站 广西壮族自治区来宾市象州县
潮阳市巴土客运中心 广东省汕头市潮阳区
古桥客运站 四川省广安市华蓥市
东莞樟木头振通汽车站 东城大道
尼尔基客运中心 内蒙古自治区呼伦贝尔市莫力达瓦达斡尔族自治旗
涞水东文山乡客运站 河北省保定市涞水县
长途汽车站-公交车站 内蒙古自治区包头市白云鄂博矿区
公共汽车站务室 辽宁省丹东市东港市
西安阎良汽车站 凤凰北街21
诸暨市汽车东站 浙江省绍兴市诸暨市
清北汽车站 一零四国道
大娘水饺中央门汽车站店 下关区建宁路1号(近神策门公园)
双牌汽车站候车厅 湖南省永州市双牌县
荣县南门车站 望佛街46号
福鼎汽车北站 虹滨路
祁阳汽车总站售票厅 湖南省永州市祁阳县
白马镇客运站 河南省周口市郸城县
合江县江北客运站 四川省泸州市合江县
渝北石坪汽车站 石坪北路72
腾桥汽车站 江西省抚州市临川区
万荣客运西站 山西省运城市万荣县
柏乡汽车站 河北省邢台市柏乡县
高青县蔡旺客运站 山东省淄博市高青县
汽车换乘站 浙江省台州市温岭市
武城汽车站 山东省德州市武城县
临沭汽车站 山东省临沂市临沭县
正宗桂林卤粉新汽车站第二分店 湖南省衡阳市祁东县
潮州汽车总站 广东省潮州市湘桥区
大邑王泗农村客运站 四川省成都市大邑县
小伊汽车客运站 江苏省连云港市灌云县
林口建堂乡客运站 三零九省道
西杨寨客运站 西杨寨村内
长寿汽车总站出口 重庆市
甘旗卡客运站 内蒙古自治区通辽市科尔沁左翼后旗
湖州练市长途客运站 浙江省湖州市南浔区
四十铺客运站 安徽省六安市金安区
新中客运站 四川省德阳市旌阳区
平南汽车站 甘肃省天水市秦州区
团风汽车客运站新站 湖北省黄冈市团风县
蓬溪高升客运站 四川省遂宁市蓬溪县
新国线黄山风景区汽车站 二零五国道汤川路
天等汽车总站保修厂 广西天等县天等镇城南街2号
合浦县第二客运站 青云南路
清凉寺客运站 山西省吕梁市临县
景东芹菜塘客运站 云南省普洱市景东彝族自治县
峨眉山城北客运站 佛光北路
江陵社会车站 湖北省荆州市江陵县
平昌汽车站进站口 四川省巴中市平昌县
合肥汽车客运西站 合肥市长江西路99号
古敢水族乡汽车客运站 云南省曲靖市富源县
涡阳城西客运站 安徽省亳州市涡阳县
清流县灵地客运站 福建省三明市清流县
老汽车站-公交车站 广西壮族自治区来宾市金秀瑶族自治县
中共陆川汽车总站支部委员会 广西壮族自治区玉林市陆川县
巴州汽车客运总站 北山路75号
克山双河客运站 零四九县道
新泰客运站候车厅 山东省泰安市新泰市
兰州天水路汽车站 天水南路110
尊桥客运站 江西省上饶市上饶县

Copyright © 2016 phpStudy |