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

=

1.      包 java.util.regex

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

使用String的s.matches(19//d//d)即匹配19xx(数字)

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

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

匹配中文\uxxxxx非ASCII码用\u####

用 . 可以匹配任何字符

\d 可以匹配一个数字

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

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

\D 可以匹配非数字

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

\S 可以匹配非空白字符

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

+ 表示匹配至少一个字符

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

{n} 可以匹配n个字符

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

 

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

java中什么是表达式什么是语句 java 正规表达式_正则表达式

 

          

java中什么是表达式什么是语句 java 正规表达式_字符串_02

 

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

java中什么是表达式什么是语句 java 正规表达式_JAVA_03

 

 

.      非贪婪匹配

 

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

 

注意区分?的作用

java中什么是表达式什么是语句 java 正规表达式_java中什么是表达式什么是语句_04

 

 

.      搜索和替换

 

可以使用String的spilt()函数匹配

               

java中什么是表达式什么是语句 java 正规表达式_正则表达式_05

 

 

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

 

        

java中什么是表达式什么是语句 java 正规表达式_字符串_06

 

 

 

 

                

java中什么是表达式什么是语句 java 正规表达式_字符串_07

 

 

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

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)方法 ,使用==是判断两个字符串的地址是否相同,而后者才是内容是否相同。