JAVA正规表达式个人学习总结(一)

编译原理实验需要解析词法,发现正规表达式十分有用,因此自学了一些,做实验和作业够用但是不够深入,只学习了基本用法。

笔记:    参考视频:https://www.bilibili.com/video/BV15E411b7o6?p=6

1.      java.util.regex

2.      JAVA中一个反斜杠表示转义字符,所以要用两个反斜杠

使用Strings.matches19//d//d)即匹配19xx(数字)

3.      匹配规则 从左到右依次匹配。

匹配特殊字符需要转义,大部分,但是加上都没错。

匹配中文\uxxxxxASCII码用\u####

. 可以匹配任何字符

\d 可以匹配一个数字

\w 可以匹配字母、数字、或者下划线   (这玩意匹配标识符应该挺好)

\s 可以匹配空白字符 如空格或者TAB

\D 可以匹配非数字

\W 可以匹配非字母、数字、下划线

\S 可以匹配非空白字符

表示匹配任意个字符(像闭包)

+ 表示匹配至少一个字符

?表示匹配零个或者一个字符

{n} 可以匹配n个字符

{n,m} 可以匹配n~m个字符

 

{n,} 可以匹配至少n个字符

 

          

 

4.      分组匹配

 

使用()可以分组匹配并提取。之前直接用String类的matches方法,而进行分组匹配和提取的话需要使用Pattern类和Matcher类,实际上String中也是调用的上述类的方法,反复用String 的类的方法匹配速度慢。

使用Pattern p= Pattern.compile(正则表达式) 规定规则

Matcher m =p.mathces(s) 来提取字符串 判断m.matches是否符合,如果符合可以用字符串S1 = m.group(1) 这种形式来接受分割好的子串。而group(0)是整个子串

5.      复杂匹配规则

对于一个正则表达式^ 规则 是完整格式,但是JAVA默认只匹配一行,写不写无所谓

[…]可以匹配范围内的某一字符。比如[abc]1 可以匹配a1 b1 c1

对于中括号,还可制定范围 [a-f]就是匹配a-f的字符

同时可以在一个括号里写多个范围 如 [a-f0-9]{6} a-f . 0-9的任意6个字符

同时中括号里还可以加上任意想匹配的字符

[^..]匹配非范围内的字符

 

可以用 AB|CD 匹配AB或者CD

 

 

       6.      非贪婪匹配

 

正则表达式默认使用贪婪匹配,即尽可能多的向后匹配。可以在规则后加?表示非贪婪匹配

 

注意区分?的作用

 

 

         7.      搜索和替换

 

可以使用Stringspilt()函数匹配

               

 

 

                 Mathcer.find()进行搜索,Pattern.compile参数还可以大小写不敏感

 

        

 

 

 

 

                

 

 

部分代码:(水平有限初学者,有错误请指正)

1.   // 判断是否为字母和数字组合 单独一种也可以

boolean isletterornum(String s) {

Pattern p = Pattern.compile("[0-9a-zA-Z]{1,}");

Matcher m = p.matcher(s);

return m.matches();

}  

 

 

2. // 判断是否只有字母

boolean isletter(String s) {

Pattern p = Pattern.compile("[a-zA-Z]{1,}");

Matcher m = p.matcher(s);

return m.matches();

}

3.  // 判断是否为一个小数或者整数,即无符号数

boolean isconstNumber(String str) {

String reg = "^[0-9]*\\.*[0-9]*?$";

return str.matches(reg);

 

}

4.  // 判断是否含有字母

public boolean ishaveletter(String str) {

String regex = ".*[a-zA-Z]+.*";

Matcher m = Pattern.compile(regex).matcher(str);

return m.matches();

}       

 

 

 同时在实验过程中发现一个自己之前没有注意到的点,想比较两个字符串是否相同不能用==   应该用String类的String.equal(String s)方法 ,使用==是判断两个字符串的地址是否相同,而后者才是内容是否相同。


posted @ 2020-09-26 14:30  HaiTianChen  阅读(259)  评论(0)    收藏  举报