java类与正则式

1、String与StringBuffer对比

功能String类StringBuffer类
末尾添加任何类型数据append(…)
插入任何类型数据insert(…)
删除字符delete(…) deletecharAt(…)
修改replace(…) replaceAll(…)replaceFirst(…)replace(…) replaceAll(…)
查找定位indexOf(…) lastIndexOf(…)indexOf(…) lastIndexOf(…)
长度length()length()
容量capacity()
当前位置字符charAt()charAt()
取子串substring()substring()
结构分析(拆分)split()
结构分析(头部)startsWith()
结构分析(尾部)endsWith()
匹配matches()
大小与相等比较equals() equalsIgnoreCase() compareTo()

总结
String类做结构分析与字符串比较
StringBuffer类做增删
举例

/*删除下标为偶数的字符*/
//原始想法:
StringBuilder sb=new StringBuilder("汉字abc123");
for(int i=0;i<sb.length();i=i+2)
	sb.deletecharAt(i);
System.out.println(""+sb);
//输出结果:
//字ac13
//分析:
/*结果错误
原因:删除一个字符后,其余字符会向前挪动*/
//改进方法:
//1、从右往左删除
...
for(int i=sb.length()-1;i>=0;i--){
	if(i%2==0)
		sb.deletecharAt(i);
}
...
//2、还是从左往右删除
...
for(int i=0;i<sb.length();i++){
	sb.deletecharAt(i);
}
...

2、Random类

使用java.util.Random包,Random构造器可带种子也可不带种子。

方法描述
nextInt()返回下一个int类型的伪随机数,值在最大值与最小值之间
nextInt(int n)返回下一个int类型的伪随机数,值在0-n之间
nextLong()返回下一个long类型伪随机数,同上
nextDouble()
nextBoolean()…,值为true或false
//随机产生0-100的数
Random r=new Random();
for(int i=1;i<=10;i++)
	System.out.print(" "+r.nextInt(100));

3、数据结构包

ArrayList类

//十进制数转换为二进制数
ArrayList<Integer> al=new ArrayList<Integer>();//<>里面是数据类型的包装类
int n=128;
do{
	al.add(n%2);
	n/=2;
}while(n!=0);
for(int i=al.size()-1;i>=0;i--)
	System.out.print(" "+al.get(i));

HashMap类
构造器:

HashMap(int initialCapacity,float loadFactor)//容量,装填因子

装填因子=已有元素/总容量:默认为0.75,若高于装填因子,则自动扩充容量

//频度统计
String ds="汉字汉字我我我计算机计";
HashMap<Character,Integer> hm=new HashMap<Character,Integer>();
for(int i=0;i<ds.length();i++){
	char c=ds.charAt(i);
	int v=0;
	hm.put(c,hm.get(c)==null?1:hm.get(c)+1);
}
System.out.print(" "+hm);//hm的toString已经定义:key+value

4、正则表达式

变量名取法:以字母开头,由字母,数字,下划线组成的串。这个就是用汉语描述的正则式。

特殊字符描述
[abc]a、b、c中的任意一个字符
[^abc]除了a、b、c中的任意一个字符(否定)
[a-zA-Z]a-z或A-Z的任意字符(范围)
\s空白符
\S非空白符
\d数字
\D非数字
\w单词字符
.任意一个字符
\反斜线字符\
\uhhhh十六进制表示的unicode值为hhhh的字符
x*0个或多个x(最大匹配)
x+一个活多个x(最大匹配)
x?0个或一个x(最大匹配)
x(n)恰好n个x
x(n,)至少n个x
x(n,m)至少n个x,不多于m个x
x*?0个或多个x(最小匹配)
x+?1个或多个x(最小匹配)
x??0个或1个x(最小匹配)
xyx后跟y
x|yx或y
(x)定义补货组
\n与第n个捕获组相匹配的字串

java中表示正则规则:\ 加倍
举例:
1、要求:串"x_y"_中是abc中的任意一个
x[abc]y

System.out.print("xay".matches("x[abc]y"));
//结果:true
//表示该字符串满足该正则表达式

2、一个数字:正则式:\d java中表示:"\\d"
数字集(可空):正则式:\d* java中表示"\\d*"
数字集(不空):\d+ “\\d+”
1-4个的字串 \d{1,4} “\\d{1,4}”
3、IP地址:192.16.5.170如何用正则表达式表示
首先在结构上数字+.出现了三次表示:(\d{1,3}\.){3}
最后加上1-3个数字:(\d{1,3}\.){3}\d{1,3}
java中表示(\加倍):

"(\\d{1,3}\\.){3}\\d{1,3}"

4、常见串:

//一个汉字:
[\u4e00-\u9fa5]
//汉字串:
[\u4e00-\u9fa5]+
//一个英文字符
[a-zA-Z]
//英文单词
[a-zA-Z]+

5、对空格进行拆分:

String s="copy     a.txt    b.txt"
String[] ss=s.split("\\s+");
for(String e:ss)//元素类型 取变量名: 数组名
{
	System.out.println(e);
}//防止出现数组下标越界
//结果:
copy
a.txt
b.txt

6、提取所有数字串

String s="45s5dasdasd58aw8ea";
String ss[]=s.split("[^0-9]+");//非数字组成的串起分割作用
...

7、最大匹配与最小匹配:
a*b
中间部分尽可能大
a*?b
中间部分尽可能小
对于串accccbbbbbb:
a*b:a与第一个a匹配,b与组后一个b匹配
a*?b:a与最后一个a匹配,b与第一个b匹配
8、组:
((x)(y)):从左往右,左括号分别为1、2、3号组
举例:写一个表示重复的正则式

//aaaaaa怎么表示
//首先对于任意一个字符一号组表示:(.)
//后面跟与一号组相配的字符表示:(.)\1
//重复任意次:(.)\1*
String s="aaaabbbb111";
s.replaceAll("(.)(\\1)*","$1");//正则式,替换串,$1是replaceAll特别规定的

位置相配:
(?=X):这个位置的右边都能匹配X。
(?!X):这个位置的右边都与X不匹配。
(?<=X):这个位置的左边都能匹配X。
(?<!X):这个位置的左边都与X不匹配。
\G:上一次匹配的结束位置
^:行开头匹配
$:行结束匹配
举例:
1、^a$:这一行仅有a
2、位置拆分:

/*对于一个串aaabbbcccdddeeeff,将串每三个一组拆分成:
aaa
bbb
ccc
ddd
eee
ff
对于某个位置,他的上一个位置的左边存在三个字符
(?<=\G.{3})
*/

正则类

Pattern类:
每一个类对象就是一个正则表达式,(即将正则表达式的String转换为更高效的内部模式叫做Pattern)
这个类的构造器无法调用,所以调用工厂方法,将正则表达式转换为Pattern对象。
Matcher类:
称为状态机对象
appendReplacement(StringBuffer sb,String replacement)
appendTail(StringBuffer sb)
综合举例:
1、将字符串中的整数提取出来

	String s="asd8wd5+fdfd50asd(dasd56+a)";
	Pattern p=Pattern.compile("//d+");
	Matcher m=p.matcher(s);//从数据源s中每次匹配上述正则式
	while(m.find())//find()开始从s中搜索匹配
	{
		String rs=m.group();//将找到的匹配作为组提取
		System.out.println(" "+rs);
	}

2、提取英文单词,仅仅需要改边正则式即可

...
Pattern p=Pattern.compile("[a-zA-Z]+");
...

3、提取英文单词或数字

Pattern p=Pattern.compile("[a-zA-Z]+|\\d+");//字母串或者数字串

4、设计一个Java程序,完成: 给出一种物质的分子式(不带括号),求分子量。
本题中的分子式只包含4种原子,分别为C, H, O, N,原子量分别为12.01, 1.008, 16.00, 14.01(单位:g/mol)。
输入界面:
请输入分子式:C6H5OH
输出界面:
分子式:C6H5OH 的分子量为94.108g/mol。

/*首先考虑分子式结构:是由(x,y)形式重复组成的,其中x是C,H,O,N组成的,y是数值
所以分子式结构是:([CHONchon]\d*)+,输入要判断是否满足该结构式,不满足则报错。
其次,C,H,O,N 与其分子量采用HashMap存储*/
	private static HashMap<String,Double> map=new HashMap<String,Double>();
	static{
		map.put("C",12.01);
		map.put("H",1.008);
		map.put("O",16.00);
		map.put("N",14.01);
	}//静态初始化块
	public static double cal(String s){
		Pattern p=Pattern.compile("([CHONchon])(\\d*)");
		Matcher m=p.matcher(s);
		double mw=0;
		while(m.find())
		{
			String g1=m.group(1);//x
			String g2=m.group(2);//y
			double dg1=map.get(g1.toUpperCase().trim());//toUpperCaseg1转成大写,trim()去掉可能存在的空格
			int n=1;
			try{
				n=Integer.parseInt(g2);//转为整型
			}catch(Exception e){
				n=1;
			}//异常捕获
			mw=mw+dg1*n;
		}	
		return mw;
	}

5、模板引擎处理,设计模板

	pubilc class Template{
		static HashMap<String,String> map=new HashMap<String,String>();
		static{
		map.put("name","王平");
		map.put("age","32");
		map.put("city","南京");
	}
	public static void main(String [] args)
	{	
		String temp="欢迎${name}来到${city}!";
		Pattern p=Pattern.compile("\\$\\{\\s*([a-zA-Z]+)\\s*\\}");
		StringBuffer sb=new StringBuffer();
		Matcher m=p.matcher(temp);
		while(m.find())
		{	
			m.appendReplacement(sb,map.get(m.group(1)) );//第一次循环sb中存储 欢迎王平
		}
		m.appendTail(sb);//感叹号不能少
		System.out.println(" "+sb.toString());
	}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K_K_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值