/**使用正则表达式的基本方法:
(一)建立
String regex="";//regex匹配
String input="";//input输入
Pattern p= Pattern.compile(regex);//将给定的正则表达式(regex)编译compile()到模式(Pattern)中。 static Pattern compile(String regex)
Matcher m=p.matcher(input);//创建匹配(match)给定输入(input)与此模式的匹配器(Matcher)。 Matcher matcher(CharSequence input)
(二)处理匹配结果
//如果是用regex匹配全部input则使用。尝试将整个区域与模式匹配:boolean matches()
m.matches()
//通常只需要匹配部分input,则使用m.find() 尝试查找与该模式匹配的输入序列的下一个子序列:boolean find([int start])
//抛出:IndexOutOfBoundsException - 如果开始点小于零或大于输入序列的长度。
int tmpStart=0
while(m.find())
{
//...
tmpStart=m.end();//end()返回的是当前与模式匹配的子序列的结尾的位置。
}
(三)关于捕获
regex中()表示需要捕获的群组,匹配后,得到一个数组存放所有的捕获。
返回此匹配器模式中的捕获组数:int groupCount()//捕获是从1开始计算,0始终表示整个regex,所以想返回整个匹配的子序列可以用m.group()。
返回由以前匹配操作所匹配的输入子序列: String group()
for(int i=0;i<=m.groupCount();++i)//i=0表示m.group(0)即整个regex的匹配
{
System.out.print(m.group(i));
System.out.print(" ,starts at pos:"+m.start(i));
System.out.print(" ,ends at pos:"+m.end(i));
System.out.println();
}
(四)替换
1.替换模式与给定替换字符串相匹配的输入序列的每个子序列。String replaceAll(String replacement)
m.replaceAll("#");//input的所有与regex匹配的子序列都被替换成"#";
2.替换模式与给定替换字符串匹配的输入序列的第一个子序列。String replaceFirst(String replacement)
m.replaceFirst("#");//input第一个与regex匹配的子序列被替换成"#";
3.用捕获的内容进行替换
m.replaceFirst("$1");//用第一个捕获的内容替换整个与regex匹配的子序列。
String forMatch="15851844444aasdddd15851866666ddd15851822222ddd15851899999";//ddd15851877777
String regex="1[3458]\\d{4}(\\d)\\1{4}";
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(forMatch);
int tmpStart=0;
int cntMatches=0;
while(m.find(tmpStart))
{
tmpStart=m.end();
System.out.println("matches "+(++cntMatches)+" : ");
for(int i=0;i<=m.groupCount();++i)
{
System.out.print("match "+i+" : ");
System.out.print(m.group(i));
System.out.print(" ,starts at pos:"+m.start(i));
System.out.print(" ,ends at pos:"+m.end(i));
System.out.println();
}
System.out.println();
}
*/
/**
练习题: 写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
例如:18601088888、13912366666
@author rexih
0.首先根据题目要求制作一个随机文本文件,文件内有字母和手机号码
a.创建一个手机号码生成器
规则: 第1位是1,第二位可以是数字3458其中之一,后面9位任意数字。
b.将号码随机插入到随机字母文本中。
1.建立一个ArrayList<String>存储捕获到的手机号码,建立一个字符缓冲区sb存放将作为输入的字符序列;
2.读取文件的内容 src:文件 FileInputStream //dest:屏幕
3.通过read(buf)方法读取输入流的字节数据,并将读取到的字节数据附加到字符缓冲区末尾
4.将sb转换成输入input
5.编写regex
6.将regex编译进模式Pattern
7.获取匹配器Matcher m
8.通过m的find()方法寻找每一个匹配,并通过group()获取符合要求的电话号码
9.将电话号码的字符串存入ArrayList<String>
10.打印集合中的所有电话号码。
*/
import java.io.*;
import java.util.regex.*;
import java.util.*;
public class Test
{
public static void main(String[] args) //throws Exception
{
ArrayList<String> al=new ArrayList<String>();
InputStream in=null;
byte[] buf=new byte[1024];
int cntBuf=0;
StringBuilder sb=new StringBuilder();
//生成一个用于演示的文本文件
File f=buildAFile();
try
{
//读取文件的内容 src:文件 FileInputStream
in=new FileInputStream(f);
//通过read(buf)方法读取输入流的字节数据
while(-1!=(cntBuf=in.read(buf)))
{
//将读取到的字节数据附加到字符缓冲区末尾
sb.append(new String(buf,0,cntBuf));
}
} catch (IOException e)
{
throw new RuntimeException("read file failed");
}
finally
{
//关闭输入流
if(null!=in)
{
try
{
in.close();
} catch (IOException e)
{
throw new RuntimeException("input close failed");
}
}
}
//准备好正则表达式使用的输入
String input=sb.toString();
/*准备好正则表达式:
按照题目要求:
第一位为 1 1
第二位为3458之一 [3458]
中间4位任意 \d{4}
后5位相同 (\d)\1{4} //(\d)表示将这个数字捕获因为5个数字相同,所以该数字之后4个数字应该与之相同,即与\1相同,也就是\1{4}
*/
String regex="1[3458]\\d{4}(\\d)\\1{4}";
//将正则表达式编译进模式
Pattern p=Pattern.compile(regex);
//获取输入和模式的匹配器m
Matcher m=p.matcher(input);
//获取下一次匹配的起始位置(上次匹配结果的末尾)
int tmpStart=0;
//因为号码不止一个所以需要多次匹配以获取所有号码
while(m.find(tmpStart))
{
tmpStart=m.end();//获取下一次匹配的起始位置(上次匹配结果的末尾)
newPrint("get a phone number: "+m.group());//m.group()获取本次匹配的子序列。
al.add(m.group());//添加入“电话本”
}
newPrint("All the cell phone numbers stored in ArrayList:");
int cnt=0;
for(String s:al)
{
newPrint((++cnt)+":\t"+s);
}
newPrint("The orginal file is saved at:\n"+f.getAbsolutePath());
}
//生成一个文件
public static File buildAFile()
{
//创建一个File对象用于保存文件,并且返回给主函数调用。
File f=new File("regex.txt");
FileOutputStream fout=null;
try
{
//dest是文件,使用FileOutputStream
fout=new FileOutputStream(f);
writeContent(fout);//向文件写入内容
} catch (IOException e)
{
throw new RuntimeException("builing a file failed");
}
finally
{
//关闭资源
if(null!=fout)
{
try
{
fout.close();
} catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
return f;
}
//向输出流写入内容
public static void writeContent(OutputStream out)throws IOException//异常返回给invoker处理
{
int offset=0;
for(int i=0;i<100;++i)
{
//每一百个字母中随机选择一个位置,随机判断是否用电话号码替代掉,概率为1/10
offset=getRand(0,99);
for(int j=0;j<offset;++j)
{
out.write(getRandAlphabet());
}
//判断该字符是否用电话号码替代掉,概率为1/10
if(5==getRand(0,10))
{
out.write(phoneNumGen());
}else
{
out.write(getRandAlphabet());
}
for(int j=offset+1;j<100;++j)
{
out.write(getRandAlphabet());
}
}
}
//使用Math类的random()方法获取[0.0,1.0)的随机数乘以length+begin再取整则可以得到[begin,begin+length)的整数
public static int getRand(int begin,int length)
{
return (int)(Math.random()*length+begin);
}
//随机获取一个小写字母a的ascii为97,一共有26个字母
public static char getRandAlphabet()
{
return (char)getRand(97,26);
}
//创建一个手机号码生成器。规则: 第1位是1,第二位可以是数字3458其中之一,后面9位任意数字。
public static byte[] phoneNumGen()
{
//48是0的ascii码
final int ZERO=48;
//为了方便字节流输出数据,将返回值定义为byte[]
byte[] phoneNum=new byte[11];
//step1:第一位为1
phoneNum[0]=(byte)(1+ZERO);
//step2:随机获取第二位的数字
switch(getRand(1,4))
{
case 1:
phoneNum[1]=(byte)(3+ZERO);
break;
case 2:
phoneNum[1]=(byte)(4+ZERO);
break;
case 3:
phoneNum[1]=(byte)(5+ZERO);
break;
case 4:
phoneNum[1]=(byte)(8+ZERO);
break;
}
//step3:随机写入中间4位
for(int i=2;i<6;++i)
{
phoneNum[i]=(byte)getRand(ZERO,10);
}
//step4:为了让程序结果更能说明问题,先生成一个随机数,若是0则后五位随机,若是1则后五位相同
if(0==getRand(0,2))
{
for(int i=6;i<11;++i)
{
phoneNum[i]=(byte)getRand(ZERO,10);
}
}
else
{
byte tmp=(byte)getRand(ZERO,10);
for(int i=6;i<11;++i)
{
phoneNum[i]=tmp;
}
}
return phoneNum;
}
//简化书写,打印简单的信息。
public static void newPrint(Object obj)
{
System.out.println(obj);
}
}
相关推荐
毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明
毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明,含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。该项目可以直接作为毕设、期末大作业使用,代码都在里面,系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值,项目都经过严格调试,确保可以运行!毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业设计-基于STM32单片机的心率血氧监测系统的设计源码+文档说明毕业
根据规则自动生成正则表达式
代表大写字母,*代表数字,%代表通配任意数字或大写字母仅限首尾,$代表任意数字或大写字母 (提示%号不能相邻,不能有两个百分号,只能在首尾,只能是大小写,提示范围必须后面大于前面,个位数必须补足位数输入)主要思路:遍历,判断 找范围正则验证规律例如(1-800)(001-800)(001-006)写递归。以及范围验证生成正则表达式是,位数要一样,后面要比前面大,双范围等等。(自己建的页面,控件命名还未改)截图截不下了,直接复制代码吧。初始是这样写的,但是后面发现很不严谨,范围有很大的问题。
使用正则表达式生成随机数据的方法
主要介绍了使用正则表达式生成随机数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
正则表达式基础 Regular Expression
正则表达式基础 Regular Expression 正则表达式简介 n 为什么需要正则表达式? q 文本的复杂处理。 n 正则表达式的优势和用途? q 一种强大而灵活的文本处理工具; q 提供了一种紧凑的、动态的方式,能够以一种完全通用的方式来解决各种字符串处理(例如:验证、查找、替换等)问题; q 大部分语言[d1]、数据库都支持正则表达式。 n 正则表达式定义: q 正...
正则表达式学习笔记
正则表达式学习笔记。
【校验】校验实例
检验
黑马程序员——正则表达式1:概述
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 1 正则表达式简介 1.1 正则表达式的概念 正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能够以编程的方式,构造复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配这些模式的部分,你就能够随心所欲地对它们进行处理了(摘自《Java编程思想
黑马程序员 正则表达式1 匹配和切割
---------------------- ASP.Net+Android+IO开发S、<a target="blank">.Net培训、期待与您交流! ----------------------
黑马程序员-java专题系列之1-正则表达式
------- android培训、java培训、期待与您交流! ---------- java正则表达式 使用正则表达式可以方便的对数据进行匹配,还可以实现更加复杂的字符串验证,例如拆分,替换,获取,验证这些功能,假如,现在要求判断一个数字是否是全部由数字组成,可以有下面 两种做法 例1(不使用正则表达式) import java.util.regex.*; public
黑马程序员_正则表达式学习笔记(1)
正则表达式学习笔记(1) ---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 详细请看这位大神的《正则表达式30分钟入门教程》 (学习正则表达式之前必须有个好的工具,我使用的是Regulator.exe) 一、学习正则的时候不必都记住某个元字符具体的意思,但是必须知道都有那些功...
正则表达式提取器
创建首先自定义名称,随后正则表达式所提取的公式,$1$表示第一个括号中的内容,最后的1表示第一个数据(0表示随机),最后表示如果返回的为空,则返回这个数值。使用效果,以黑马程序员官网主页为例运行结果一切都很顺利,但是过程中也有着各种问题。
黑马程序员——Java基础:反射、JDK1.5新特性、正则表达式
注:前面所有总结都是通过毕向东老师所讲的视频所得。反射部分由张孝祥老师所讲。 一、反射 反射 :是指程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。反射就是得到元数据的行为。 反射的基础是Class类: Class类:Java程序中的各个Java类属于同一类事物,描述这类事物的Java类就是Class类。 如:人——> Person //Person类代表人,它的实例对象就是张三
(七)黑马程序员——正则表达式
------- android培训、 java培训、期待与您交流! ---------- 正则表达式 * 是指一个系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。 作用:比如注册邮箱,邮箱有用户名和密码,一般会对其限制长度,这个限制长度的事情就是正则表达式做的 正则表达式善于处理文本,对匹配、搜索和替换等操作都有意想不
黑马程序员——Java基础---正则表达式
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 正则表达式 一、概述 1、 概念:符合一定规则的表达式。 2、 作用:用于专门操作字符串。 3、 特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符
python爬虫-采集黑马程序员论坛的帖子
通过浏览器搜索黑马程序员论坛(http://bbs.itheima.com/forum-644-6.html),打开Python+人工智能技术交流板块页面(https://bbs.itheima.com/forum-425-1.html),每个帖子都以相同的布局方式显示了详细的信息,包括文章标题、发布时间、文章作者等。通过爬虫技术采集文章的标题、文章的链接、文章作者和发布时间。
根据正则表达式生成随机字符串
最近做个项目需要生成大量测试数据,其中涉及到中文名字和中国大陆的身份证号码,原来是自己根据百家姓和我国身份证号各个字段的含义用SQL语句拼出来的,后来想想若是能根据正则表达式生成随机字符串,那就太好了,网上搜了下,有篇《SQL Server 生成测试数据的文章》是利用VS2010的数据库项目中有个生成数据的向导,试了下,果然还可以,但不太成熟,只支持一些简单的正则表达式,且还很容易出现乱码,生成中
通过正则表达式生成满足条件的随机数据
通常情况下,我们都是拿正则表达式去验证一个字符串是否符合要求,但有时候我们需要生成一些符合一定规则的数据的时候,我们也可以使用正则,今天我要给大家详细讲解下如何生成, 首先,我们需要一个工具,链接如下 http://download.csdn.net/detail/x359981514/7070319 进入CMD运行该程序: 参数很清楚,相信大家不用我翻译了 使用如下:
如何加减单元格指定数字_excel生成6位随机数字
我们还是使用RANDBETWEEN()函数来设置怎么生成6位随机数字,利用它的特性,即生成指定区域内的整数随机数。那么6位数最小的数字是100000,6位数最大的数字是999999,那么这个函数就可以写为:=RANDBETWEEN(100000,999999)。我以实例给大家来说一下。1、点插入函数,下图的红圈,除了新入门的朋友之外 ,大家应该都知道吧,这句就是写给新手朋友的,较懂的请直接向下看。...
java随机生成8-20位密码-包括数字、大小写字母、特殊符号。
int i = (int)(8+Math.random()*(20-8+1)) ; String pd=this.getRandomPassword(i); public String getRandomPassword(int len) { String result = null; while(len>=6){ result ...
正则表达式匹配手机号码 写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。...
1[3458]\d{4}(\d)\1{3} 1 匹配 1 [3458] 匹配 3 4 5 8 任意一个 \d{4} 匹配 4个0-9 (\d) 匹配 0-9并捕获到\1 \1{4} 匹配 4个之前捕获到的\1 public class Test9 { /** * 写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中...
数字范围正则表达式
软件开发中,需要限制编辑框的数字范围,网上搜了一些,要么漏洞很多,要么不完善,于是博主重新学了一些正则表达式的语法。不多废话,请看正题: 1、[0,255]范围内的正则表达式: ^[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|(25[0-5])$ 解析:这个范围IP地址中会用到,如果写成^[0-2][0-5]{2}$那就大错特错了,不仅会取000这样无意义的数值,还不能输入39、166等数字。 上述表达式虽长,但是分段看就很简单,将其分成5个区间: 取值范围
2557


&spm=1001.2101.3001.11974&articleId=44003483&d=1&t=3&u=1d1e5fe13c504f5499dba847a02ccc30)

被折叠的 条评论
为什么被折叠?



