编译原理实验需要解析词法,发现正规表达式十分有用,因此自学了一些,做实验和作业够用但是不够深入,只学习了基本用法。
=
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个字符
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
. 非贪婪匹配
正则表达式默认使用贪婪匹配,即尽可能多的向后匹配。可以在规则后加?表示非贪婪匹配
注意区分?的作用
. 搜索和替换
可以使用String的spilt()函数匹配
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)方法 ,使用==是判断两个字符串的地址是否相同,而后者才是内容是否相同。
一