正则表达式在大量的文本文件中对用户所关心的数据进行匹配有着十分重要的作用。
正则表达式的可以通用于SQL语句中、java脚本以及python脚本中。
正则式的语法比较统一而且易学,但是将正则用于实际的工作环境中,
还是相当有难度的,因为它的灵活度和变化都是很大的。
所以最好的掌握正则式在实际应用中的编写,而非死记硬背一些条条框框的规则。
本文的重点是介绍正则是的语法规则以及如何使用java来编写一个测试正则表达式的小程序。
这样的话,我们就可以将每次学到的正则语法规则应用于实际操作中去,
随时检验和修改自己的正则表达式了。
对于正则表达式的定义是这样的:
正则表达式(regular expressions)是一种描述字符串集的方法,是以字符串集中的共有特征为依据的。
使用正则表达式可以用于搜索、编辑以及操作文本和数据。
在java中的java.util.regex这个包的下面有相关的类
Matcher和Pattern已经实现了对正则表达式的规范化描述,以及测试匹配工作。
首先介绍一下,使用java语句来编写一个小程序,
以便于实时检查所写的正则式是否可以达到搜索、匹配输入各种类型文本的目的
下面是LZ编写的测试源代码
有一点值得留意的是:
1.对于//s?这种需要进行转义处理的字符串,
在这个小程序中是无需进行转义处理的,这应该是java的regex中的相应类在实现的时候已经进行预处理的原因吧:
总之//s?在程序中只需要写/s?就可以,如果仍然写//s?的话,原本按照正则表达式写的语句可以检查到的字段,
会显示检查不到的 。
2.另外值得注意的就是,在输入正则表达式的时候,除了必要的汉字匹配需要使用中文输入法之外,
其余全部应该使用纯英文的输入格式。
/* * the coding below is used to check the regex you write * after running could get the results you want */ package regex_test; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String[] args) throws IOException { String regexString; String checkText; BufferedReader br =
new BufferedReader( new InputStreamReader(new BufferedInputStream(System.in)) ); while(true) { System.out.print("\n 请输入您的正则表达式: \n");
regexString = new String(br.readLine());
Pattern pattern = Pattern.compile(regexString);
System.out.print("请输入您所要搜索、匹配的测试文本: \n");
checkText = new String(br.readLine());
Matcher matcher = pattern.matcher(checkText);
boolean found = false;
while(matcher.find()) {
System.out.println(" 输入的文本: \"" + checkText+
"搜索的匹配字段:\"" +matcher.group()+
" \"起始位序 "+ matcher.start()+
" 结束位序 "+matcher.end()+".\n");
System.out.println("使用正则表达式:\" "+regexString+
" \" 可以在输入文本中搜索得到匹配字段\n\n");
found = true; }//while_inner
if(!found) { System.out.println("正则表达式\" "+regexString+"\" 不能在测试文本中搜索到字段:\n "); } }//while_outer }//main }//Main_class
下面简单介绍一下,正则表达式的简单语法:
正则式所识别的所有元字符有:
() [] {} \ ^ $ | ? * + . -
有两种方法可以将元字符强制转换为普通字符:
1.在元字符前面加上 \ 反斜线这个字符。
2.把需要转换为普通字符的字符串放置到\Q \E之间即可。
对于字符的一些基础表达式的说明:
[abc] : 表示的是在匹配字符串中只要有 a 或是b 或是c 就会实现匹配成功
当然这个是简单的字符,如果是字符串的话需要这么写:
[cat|bat|rat]:这个表示的意思就是,如果输入的待检查文本中只要有
cat,bat,rat其中的一个就会匹配成功。
[^abc]: 这个表示的是,如果在输入的待检查文本中只要没有除了a或b或c
一个,就说明匹配成功。
[a-zA-Z]: 如果带匹配的字符出现在[a,z]或是[A,Z]之间,就说明匹配成功;
其中区域端点a,z,A,Z 也算在内。
[a-d[m-p]]:这种表示方法等同于[a-dm-p],解释同上,
从某种角度上来说,这是一种对两个集合[a-d]和[m-p]并集的处理,
也就是说待检查匹配的字符如果是出现在a-d 或是 m-p之间的字符,
那么此次匹配是成功的。
[a-z&&[def]]: 这个正则式描述的是,输入的字符如果在a到z之间并且也同时是
d e f 三个字符串中的一个的话,那么此次匹配检测成功,
但是这个例子举得有一点特殊,
因为这个&&从集合的角度上来说是去两个集合的交集。
但是这个例子所选取的两个集合刚好后者是前者的子集,
所以实际上改正则表达式等价于[def]
[a-z&&[^bc]]: 除了b 和c两个字符之外,a到z的所有字符
相当于差集,而^bc相当于对b或c去反,
而或去反就相当于^b & ^c,即二者的非去并集。
所以整体上来看是:只要字符是
去掉 b且去掉c 的a到z的任意一个字符,该匹配都是成功的。
[a-z&&[^m-p]]: 同样也是差集,描述的是带匹配的字符。
如果是a到z,并且不包括m到p的,任意字符,那么匹配成功。
也相当于[a-lq-z]这种的并集的表示方法。
关于预定义字符类:
.:可以用来匹配任何字符
\d: 是数字字符[0-9]
\D: 这个描述的是非数字字符:[^0-9]
\s: 描述的是空白字符,只要是[\t\n\x0B\f\r]这里面的都可以。
\w:这个是用来描述单词字符的:[a-zA-Z_0-9]
\W: 这个是用来描述非单词字符的:[^\w]
目前,LZ暂时仅用到这些,如果以后用到其他的表达式在往上面填充吧....