正则表达式在Java和JS中的应用

来源:互联网 发布:如何快速学完网络课程 编辑:程序博客网 时间:2024/05/21 06:23

正则表达式在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)); //truealert(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)); //truereg.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中关于正则表达式相关规则截取的图,照猫画虎的使用就能解决基本需求了:
这里写图片描述
这里写图片描述
这里写图片描述

——生活总有不如意,你我怎敢不努力!

0 0
原创粉丝点击