java基础10:正则表达式与反射

 

关于Java基础的文章,我觉得写得还可以,以前发在了我其它的博客了,肯定是原创,现在再分享给大家出来。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 一、正则表达式


一、概述

1、概念:

  正则表达式,又称正规表示法、常规表示法,计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

  许多程序设计语言都支持利用正则表达式进行字符串操作。

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

2、作用

给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

    1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

    2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。

3、正则表达式的特点是:

    1. 灵活性、逻辑性和功能性非常的强;

    2. 可以迅速地用极简单的方式达到字符串的复杂控制。

    3. 对于刚接触的人来说,比较晦涩难懂。

 

二、常见功能

1,匹配

Stringmatches方法

<span style="white-space:pre">	</span>/**
	 * qq号校验 需求:长度5-15的数字,不能以0开头
	 */
	private static void fun2() {
		String s = "023";

		boolean b = s.matches("[1-9][0-9]*{4,14}");
		b = s.matches("[1-9]\\d*{4,14}");// 相等

		System.out.println(b);

	}


2,切割

Stringsplit()方法

<span style="white-space:pre">	</span>/**
	 * 切割方法
	 */
	private static void fun3() {
		// 切割空格
		String s = "afdf            dfsfd         dafa";
		String[] names = s.split(" +");
		for (String name : names) {
			System.out.println(name);
		}

		// 切割叠词
		String s1 = "afdfaaaaaaadfsfdssdafa";
		String[] myNames = s.split("(.)\\1+");
		for (String name : myNames) {
			System.out.println(name);
		}
	}


3,替换

StringreplaceAll()方法

<span style="white-space:pre">	</span>/**
	 * 替换
	 */
	private static void fun4() {
		String s1 = "afdfaaaaaaadfsfdssdafa";
		String s = s1.replaceAll("(.)\\1+", "$1");
		System.out.println(s);
	}



4,获取

Matcherfind()方法,查找下一个子序列

Matchergroup()方法,返回由以前匹配操作所匹配的输入子序列

	/**
	 * 获取
	 */
	private static void fun5() {
		Pattern p = Pattern.compile("a*b");//将正则规则封装成对象
		Matcher m = p.matcher("aaaaabaaabdfdfaaabss");//匹配的字符串封装成对象
		boolean b = m.matches();
//		m.find();
//		System.out.println(m);
		while(m.find())
		{
			System.out.println(m.group());
		}
	}


三、网页爬虫

网页爬虫听起来挺好玩,但是道理非常简单,就是在互联网上获取指定规则的数据

而这个指定规则可以使用正则表达式来写

public class PaChong {

	public static void main(String[] args) throws Exception {
		List<String> list = fun1();
		for (String name: list) {
			System.out.println(name);
		}
	}

	/**
	 * @throws Exception 
	 * 
	 */
	private static List<String> fun1() throws Exception {
		URL url = new URL("http://127.0.0.1:8080/myweb/test.html");
		InputStream in = url.openStream();
		BufferedReader bufr = new BufferedReader(new InputStreamReader(in));
		ArrayList<String> list = new ArrayList<String>();
		
		String main_rgex = "\\w+@\\w+(\\.\\w+)+";
		Pattern p =Pattern.compile(main_rgex);
		String line = null;
		while((line = bufr.readLine()) != null){
			Matcher m = p.matcher(line);
			while(m.find()){
				list.add(m.group());
			}
			
		}
		return list;
	}

}



 二、反射


一,概述

 

1、定义

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用它的任意一个方法和属性;

 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 

  动态获取类中信息,就是java反射 。


2、反射好处

反射技术大大提高了程序的扩展性


3、Java反射机制主要提供了以下功能: 

在运行时判断任意一个对象所属的类;

在运行时构造任意一个类的对象;

在运行时判断任意一个类所具有的成员变量和方法;

在运行时调用任意一个对象的方法;

生成动态代理


 

二、获取Class对象


public static void getClassObject_3() throws ClassNotFoundException 	{
		
		String className = "cn.itcast.bean.Person";
		
		Class clazz = Class.forName(className);
		
		System.out.println(clazz);
	}



三、获取Class中的构造函数


<span style="white-space:pre">	</span>/**
	 * 创建有参数的实例
	 * @throws Exception 
	 */
	private static void fun2() throws Exception {
		String name = "jinfulin.b.bean";
		Class clazz = Class.forName(name);
		Constructor cons = clazz.getConstructor(String.class,int.class);
		Object obj = cons.newInstance("sf",21);
	}

	/**
	 * 创建一个新的无参的实例
	 */
	private static void fun1() throws ClassNotFoundException,InstantiationException, IllegalAccessException {
		String name = "jinfulin.p.bean.Person";
		Class clazz = Class.forName(name);
		Object obj = clazz.newInstance();//创建一个新的无参的实例
		
		System.out.println(obj);
	}




四、获取Class中的字段


Field field = null;
	clazz.getField("age");//只能获取公有的
	field = clazz.getDeclaredField("age");//只获取本类,但包含私有。
	//对私有字段的访问取消权限检查。暴力访问。
	field.setAccessible(true);

	private static void getFileDemo() throws Exception {
		Class clazz = Class.forName("jinfulin.p.bean.Person");
		Field field = null;
		field = clazz.getDeclaredField("name");//只获取本类,但包含的私有字段。
	
		field.setAccessible(true);//对私有字段的访问取消权限检查。暴力访问。
		Object obj = clazz.newInstance();
		field.set(obj, "金福林");
		Object o = field.get(obj);
		System.out.println(o);
	}


四、获取Class中的方法

<span style="white-space:pre">		</span>Method[] methods  = clazz.getMethods();//获取的都是公有的方法。 
		methods = clazz.getDeclaredMethods();//只获取本类中所有方法,包含私有。 
		method.invoke(obj, "小强",89);//设置参数值

	public static void getMethodDemo_3() throws Exception {
		Class clazz = Class.forName("cn.itcast.bean.Person");
		Object obj = clazz.newInstance();
		Method method = clazz.getMethod("paramMethod", String.class,int.class);
		
		method.invoke(obj, "小强",89);
	}


 三、最后


正则表达式用起来虽然简单,但是符合复杂,可读性差,不过呢,一些常见的字符串的正则表达式比如邮箱、身份证号等都可以在网上找的,拿过来用就好。

反射技术比较重要,反射还可以和抽象工厂模式结合做更换db用,反射的知识以后还会再讲到的。






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值