正则表达式在Java和JS中的应用
新年在家,网不好,又没啥活动,过年越来越没意思了,为了完成自己的计划–React Native的使用和安卓Native的结合,下来自己了解学习了一下javascript的相关知识,毕竟JS(javascript)作为一门大众广泛的脚本语言,并且对自己有也帮助。JS作为一门弱类型语言,学习起来跟java大同小异。当看到使用正则表达式的时候让我不免想到了java中是如何使用正则表达式的,从接触java到目前一年多时间,也没看到正则表达式在java里面的具体使用。翻了翻java源码,测试了一波,总结如下:
java中使用正则表达式:
java中的正则表达式在java/util/regex包下面,里面6个文件,包括4个类1个接口1个枚举(1.5以后才有的枚举,这个枚举以前的版本是啥表示呢?),包结构如下:
其中ASCII.class 文件为:字符的Ascll编码,大小写、空格换行、字符等编码。学习中只需要记住几个关键的就可以,48(0)、56(A)、97(a)。它这个大排布也跟一般的排序规则相同:数字/大写字母/小写字母,这个顺序。
Matcher.class:实现类,实现MatchResult接口具体的匹配方法规则,其中最重要的几个方法为matches(),find(),start(),end()等这么几个方法;
MatchResult.class:结果集接口,定义匹配规则
Pattern.class:正则表达式载体,构建正则表达式。其中主要的几个方法为compile(),matcher(),split(),matches()等方法;
PatternSyntaxException.class:一个对于表达式解析匹配出异常的异常类,不用管的。
UnicodeProp.class:Unicode编码方式,一种对于Ascll码的扩充编码,Ascll编码一个字符表示一个字节,最大256个,比较局限。而Unicode的一个字符代表两个字节,取值范围更广。
使用正则表达式,最简单的使用只需要三行代码即可,使用说明的部分在Pattern类中可以查到如下:
图片中的55行~58行即为一个简单的正则表达式使用步骤,比如下面:
private static void methold1() {
//创建表达式
Pattern p1 = Pattern.compile("[stk]");
//待测试字符串
String test1="ambition";
//获得Matcher对象
Matcher m1 = p1.matcher(test1);
//执行macher运算匹配规则
boolean result1 = m1.matches();
System.out.println(result1);//fasle
}
上面的输出结果为fasle,因为maches()方法执行的为全匹配,而表达式规则[skt]为中括号里面的任意一个满足,一个一对多的匹配过程。其次,Pattern.compile(s1,s2)还有两个参数的方法,第二个参数是一个模糊的匹配标志,这个方法一般不怎么用。如果改成这样,结果就为true了。
private static void methold2() {
Pattern p1 = Pattern.compile("[stk]");
String test1="k";
Matcher m1 = p1.matcher(test1);
boolean result1 = m1.matches();
System.out.println(result1); //true
}
当然,如果你只是想使用一次正则表达式而不像去创建更多对象,可以使用Pattern类的一个静态方法matches()方法即可替代上面的步骤,得到一个匹配结果,如上图事例模板的60~63行所述。如下:
private static void methold3() {
//第一位表达式,第二个为测试字符串
boolean result1 = Pattern.matches("[skt]", "s");
System.out.println(result1); //true
}
当然其中还有几个重要方法,如下:
private static void methold4() {
Pattern p1 = Pattern.compile("[stk]");
String test1="ambtion";
Matcher m1 = p1.matcher(test1);
boolean result1 = m1.find();
System.out.println(result1);//true
int start = m1.start();
int end = m1.end();
System.out.println(start+";"+end);//3;4
}
find()方法为查找被测字符串,也比较常用。还有start()返回第一个与之匹配的索引位置从0开始,end()方法可并不是返回最后一个与之匹配的位置,而是第一个匹配的偏移量即索引+1。另一个重要的方法来自于Pattern类的Split()方法,使用也比较多,如下:
private static void methold5() {
//定义规则,以逗号或等号为匹配
Pattern p1 = Pattern.compile("[,=]");
String test1="id=201,name=uzi,age=19";
//按规则分割测试字符串,得到结果数组
String[] split = p1.split(test1);
for(int i=0;i<split.length;i++){
System.out.print(split[i]);
if (i==split.length-1) {
break;
}
System.out.print(";");
}
//id;201;name;uzi;age;19
}
按照一定规则将字符串分割。此处有一个需求:若需要对这个字符串”{{aaaa}}-{{bbb}}”进行替换操作(大括号里面无论为啥),最后结果为aaaa-bbb。看如下:
private static void methold6() {
//将{{aaa}}-{{bbbbb}}替换成aaa-bbbb
Pattern p = Pattern.compile("[{{|}}]");
String s="{{aaa}}-{{bbbbbb}}";
Matcher m1 = p.matcher(s);
String replaceAll = m1.replaceAll("");
System.out.println(replaceAll); //结果aaa-bbbbb替换成功
以上为正则表达式在java中的简单实用,若想深入还需看上面提到的几个类。
JS中使用正则表达式:
学习javascript我用的工具为HBuilder,一个原本是用来开发Web应用和WebApp的工具,其实eclipse也可以学习,但没有提示。HBuidler有提示,但不会报错,查错是很费时的。学习中还发现一个问题,在HBuilder中写JS文件里面,当使用try-catch和throw相关时,没有反应,应该是有Bug,其他暂时还可以。(HBuilder使用)
JS中使用正则表达式规则没有java中的多,弱类型语言相对简单。Regexp对象属性有:
当然这些属性也可以在代码中获得。Regexp对象方法有:
支持正则表达式的String对象的方法有:
下面简单的使用几个api测试,代码如下:
function test1(){
//创建表达式,构造方法
var reg=new RegExp("[bk120]");
//待测语句
var test1="woshibk,120";
//窗口提示结果
alert(reg.test(test1)); //true
alert(reg.matches(test1)); //没有反应
}
构造方法获得表达式对象,构造方法可以有两个参数的,new RegExp(s1,s2),s2为匹配参数可选值为i,g,m用于表示对大小写不敏感,全局匹配和多行匹配等。test()函数相当于java中的find()方法,其中也有match()方法,使用效果与下面的一致。而matches()方法使用没反应。其次一个重要的方法为exec(),使用如下:
var reg=new RegExp("[bk120]");
var test1="woshibk,120";
var test2="hhaac";
alert(reg.exec(test1)+";"+reg.exec(test2));//b;null
alert(test1.match(reg)+";"+test2.match(reg));//b;null
exec()方法使用返回结果为第一个与之匹配的内容,若没有匹配的则返回null。下一个方法为compile()方法,为正则表达式增加规则,如下使用:
function test1(){
var reg=new RegExp("ab");
var test="abc";
alert(reg.test(test)); //true
reg.compile("f");
alert(reg.test(test)); //fasle
}
JS中也有split()函数,由于其属于Object的函数,使用起来跟正则表达式没有多大关系,比如如下使用:
var msg="id=110,name=book";
var o1=msg.split(",|=");//试图用多个符号分割
var o2=msg.split(",");
alert(o1.length+";"+o2.length); //1;2
由其数组长度可以看出,多个分割符号一起使用并没有作用,只能单独的使用。
需求:若需要对这个字符串”{{aaaa}}-{{bbb}}”进行替换操作(大括号里面无论为啥),最后结果为aaaa-bbb。怎么操作?这里就需要replace函数了:
var reg=new RegExp("{{|}}","g"); //"g"全局搜索
var msg="{{aaaa}}-{{bbbb}}";
alert(msg.replace(reg,"")); //结果为aaaa-bbbb
以上就为正则表达式在Java和JS中的使用方法,总结不够全面深刻,以后还需深入学习呀!
正则表达式:
正则表达式是对字符串执行模式匹配的强大工具,使用广泛,比如经常所见的用户登录注册时名和密码的判断,各种网络请求提交,很多编辑工具、编程工具,比如当前使用的MarkDown工具符号匹配,H5中各种标签匹配等。下面是在W3C中关于正则表达式相关规则截取的图,照猫画虎的使用就能解决基本需求了: