正则表达式和反射

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1:正则表达式
(1)正则表达式:就是符合一定规则的字符串。
(2)规则字符:
正则表达式的规则字符:
A:字符
x 字符 x,任意字符代表自己本身。
\\ 反斜线字符 
\r 回车
\n 换行

B:字符类
[abc] a、b 或 c,任意字符一次。
[^abc] 任何字符,除了 a、b 或 c 
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内
[0-9] 任意的数字字符一次

C:预定义字符类
. 任意的字符
\d 数字:[0-9] 
\w 单词字符:[a-zA-Z_0-9] 
单词字符:英文,数字,及_

D:边界匹配器
^ 行的开头 
$ 行的结尾 
\b 单词边界(也就是说这里出现的不能是单词字符)
abc hello world?haha

E:Greedy 数量词 
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 

F:组
捕获组可以通过从左到右计算其开括号来编号。组零始终代表整个表达式。

((A)(B(C))) 

第一组:(A)(B(C))
第二组:A
第三组:B(C)
第四组:C

(3)常用功能:
A:判断功能

String -- matches

/*
 * 校验邮箱:xxx@yyy.zzz
 * 
 * liuyi@163.com
 * linqingxia@126.com
 * yangmi@qq.com
 * liukaiwei@sina.com.cn
 * shaoyifu@yahoo.cn
 * hello@itcast.cn
 */
public class RegexTest {
	public static void main(String[] args) {
		// 定义规则
//		String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,8}(\\.[a-zA-Z_0-9]{2,3})+";

		String regex = "\\w+@\\w{2,8}(\\.\\w{2,3})+";
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入你的邮箱:");
		String email = sc.nextLine();
		boolean flag = email.matches(regex);
		System.out.println(flag);
	}
}


B:切割功能

String -- split

/*
 * 切割功能:
 * 		public String[] split(String regex)
 */
public class RegexDemo {
	public static void main(String[] args) {
		// 切割字符串"aa,bb,cc";
		String str = "aa,bb,cc";
		String regex = ",";
		String[] strArray = str.split(regex);
		for (String s : strArray) {
			System.out.println(s);
		}
		System.out.println("**************");
		// 切割字符串"aa.bb.cc"
		String str2 = "aa.bb.cc";
		String regex2 = "\\.";
		String[] strArray2 = str2.split(regex2);
		for (String s : strArray2) {
			System.out.println(s);
		}
		System.out.println("**************");
		// 切割字符串"-1 99 4 23"
		String str3 = "-1 99 4 23";
		String regex3 = " ";
		String[] strArray3 = str3.split(regex3);
		for (String s : strArray3) {
			System.out.println(s);
		}
		System.out.println("**************");
		// 切割字符串"-1     99              4 23"
		String str4 = "-1     99              4 23";
		String regex4 = " +";
		String[] strArray4 = str4.split(regex4);
		for (String s : strArray4) {
			System.out.println(s);
		}
		System.out.println("**************");
		// 切割字符串"D:\itcast\20131130\day27\code"
		String str5 = "D:\\itcast\\20131130\\day27\\code";
		String regex5 = "\\\\";
		String[] strArray5 = str5.split(regex5);
		for (String s : strArray5) {
			System.out.println(s);
		}
	}
}


C:替换功能

String -- replaceAll

/*
 * 替换功能:
 * 		public String replaceAll(String regex,String replacement)
 * 		用给定的字符串去替换字符串对象中满足正则表达式的字符。
 */
public class RegexDemo {
	public static void main(String[] args) {
		// 用”#”替换叠词:"sdaaafghccccjkqqqqql";
		String str = "sdaaafghccccjkqqqqql";
		String regex = "(.)\\1+";
		String result = str.replaceAll(regex, "#");
		System.out.println(result);
		System.out.println("--------------------");
		// 叠词保留一次
		String str2 = "sdaaafghccccjkqqqqql";
		// 叠词是在同一个字符串中用\编号来引用
		String regex2 = "(.)\\1+";
		// 在替换方法中,第二个字符串数据中可以使用$编号的形式来引用第一个正则表达式中的组的内容
		String result2 = str2.replaceAll(regex2, "$1");
		System.out.println(result2);
		System.out.println("--------------------");

		// 有些论坛不允许发电话,qq号,银行账号等.
		// 把数字用“*”替换wert13245asfklwyoeworewsfd6744232433fafs
		String str3 = "wert13245asfklwyoeworewsfd6744232433fafs";
		// String regex3 = "\\d+";
		String regex3 = "\\d";
		String result3 = str3.replaceAll(regex3, "#");
		System.out.println(result3);
	}
}



D:获取功能
Patter
Matcher

find()

group()

/*
 * 获取功能:
 * 		使用模式对象Pattern和匹配器对象Mathcher
 */
public class RegexDemo {
	public static void main(String[] args) {
		// // 把正则表达式编译成模式对象
		// Pattern p = Pattern.compile("a*b");
		// // 通过模式对象调用匹配方法获取到匹配器对象
		// Matcher m = p.matcher("aaaaab");
		// // 调动匹配器对象的判断功能
		// boolean b = m.matches();
		// System.out.println(b);

		// 这道题目我们还可以通过判断功能
		// String regex = "a*b";
		// String str = "aaaaab";
		// boolean flag = str.matches(regex);
		// System.out.println(flag);

		// 定义规则
		String regex = "\\b[a-z]{3}\\b";

		String str = "da jia zhu yi le, ming tian bu fang jia, xie xie!";
		// 想要获取3个字符组成的单词

		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(str);
		// public boolean find()
		// 判断看是否存在有满足条件的子串
		// boolean flag = m.find();
		// System.out.println(flag);
		// //获取子串
		// //public String group()
		// String s = m.group();
		// System.out.println(s);
		while(m.find()){
			System.out.println(m.group());
		}
	}
}





2:反射
(1)反射:就是通过class文件对象,去使用构造方法,成员变量,成员方法。
(2)获取class文件对象
A:Object类的getClass()方法
B:数据类型的静态的class属性
C:Class类forName()静态方法


推荐:开发使用第三种。
(3)反射的应用

A:通过反射获取构造方法并使用

/*
 * 反射获取构造方法并使用。
 * 
 * 构造方法		Constructor
 * 成员变量		Field
 * 成员方法		Method
 * 
 * 
 */
public class ReflectDemo {
	public static void main(String[] args) throws ClassNotFoundException,
			NoSuchMethodException, SecurityException, InstantiationException,
			IllegalAccessException, IllegalArgumentException,
			InvocationTargetException {
		// 获取字节码文件对象
		Class c = Class.forName("cn.itcast_01.Person");

		// 获取构造器对象
		// 所有公共构造方法
		// public Constructor<?>[] getConstructors()
		// Constructor[] cons = c.getConstructors();
		// 所有构造方法
		// public Constructor<?>[] getDeclaredConstructors()
		// Constructor[] cons = c.getDeclaredConstructors();
		// for (Constructor con : cons) {
		// System.out.println(con);
		// }

		// 一般我们创建对象,只要一个构造方法就可以了,所以,我们只需要获取一个构造方法即可。
		// 我先以无参数构造方法举例
		// public Constructor<T> getConstructor(Class<?>... parameterTypes)
		Constructor con = c.getConstructor();// 表示我使用的是无参数构造方法

		// 通过构造器对象创建对象
		// public T newInstance(Object... initargs)
		Object obj = con.newInstance();
		
		System.out.println(obj);
	}
}


B:通过反射获取成员变量并使用

/*
 * 获取成员变量并使用。
 */
public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		// 获取字节码文件对象
		Class c = Class.forName("cn.itcast_01.Person");

		// 获取成员变量对象
		// Field[] fields = c.getFields();// 获取所有公共的成员变量
		// Field[] fields = c.getDeclaredFields();// 获取所有的成员变量
		// for (Field field : fields) {
		// System.out.println(field);
		// }
		
		//获取构造器对象
		Constructor con = c.getConstructor();
		Object obj = con.newInstance();

		// 获取单个的成员变量
		Field field = c.getField("age");
		
		// obj.field = 20;
		//public void set(Object obj,Object value)
		field.set(obj, 20);//给obj对象的field字段赋值为20
		
		
		System.out.println(obj);
	}
}


C:通过反射获取成员方法并使用



/*
 * 获取成员方法并使用。
 */
public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		// 获取字节码文件对象
		Class c = Class.forName("cn.itcast_01.Person");

		// 创建对象
		Constructor con = c.getConstructor();
		Object obj = con.newInstance();

		// Method[] methods = c.getMethods();// 所有公共方法,包括父类的
		// Method[] methods = c.getDeclaredMethods();// 本类的所有方法
		// for (Method method : methods) {
		// System.out.println(method);
		// }
		
		//第一种:无参数无返回值
		Method m1 = c.getMethod("show", null);
		m1.invoke(obj, null);
		System.out.println("---------------");
		//第二种:带参数无返回值
		Method m2 = c.getMethod("function", String.class);
		m2.invoke(obj, "林青霞");
		System.out.println("---------------");
		//第三种:带多个参数有返回值 
		Method m3 = c.getMethod("reutrnValue", String.class,int.class);
		Object ooo = m3.invoke(obj, "林青霞",26);
		System.out.println(ooo);
		System.out.println("---------------");
		//第四种:私有方法的调用
		Method m4 = c.getDeclaredMethod("hello", null);
		m4.setAccessible(true);
		m4.invoke(obj, null);
	}
}


---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值