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(最小匹配)
xy x后跟y
x|y x或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());
	}
	}

猜你喜欢

转载自blog.csdn.net/NiZjiTouA/article/details/90692630