java正则表达式总结
最近工作要使用文件上传解析,上传还好,但是在解析文件的时候,却踩到了好多坑,今天就说说其中的一块吧,正则匹配。
由于上传的文件统一都是csv文件,所以在解析文本的时候,肯定要碰到正则表达式的,先解释一下,csv文件类似excel文件,但是各个数据之间是以逗号隔开的,而需求是,上传的csv文件中某些字段是json格式的字符串,这就是说,有可能json里面也是会有逗号的,因此,使用网上的代码或者java提供的api是不能满足需求的,必须要去手动解析文件。好了,下面我们讲解java语言下的正则表达式的用法。
在java中要使用正则表达式常用的方法,请看如下代码:
1 /* Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建, 2 pattern()返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数*/ 3 String sequence; 4 Pattern indexPattern = Pattern.compile ("\\[(.*?)\\]"); //通过Pattern的静态方法去创建一个正则表达式 5 //System.out.println(indexPattern.pattern()); //。 return: \\[(.*?)\\] 7 Matcher indexMatcher = indexPattern.matcher (sequence); //进行匹配 8 while(indexMatcher.find())//find方法是查找串中是否包含正则表达式的子串,matches()方法是去匹配串是否符合正则表达式的规则,一旦有一个子串不符合,返回false 9 { 10 System.out.println(indexMatcher.groupCount()+":"+indexMatcher.group());//group()函数存放的就是匹配的结果,也可以使用indexMatcher.start()和indexMatcher.end()函数来取得匹配到的子串在字符串中的位置索引 11 }
还有2个重要方法在此也要说明一下,就是正则表达式分割和替换:
1 Pattern p=Pattern.compile("\\d+"); //匹配数字 3 String[] str=p.split(sequence); //分割 5 String newSequence = sequence.replaceAll("\\d+" , "#") //将串中所有的数字都用#替换
split()将模式串按照给定的正则表达式切割成字符串数组。
下面我们讲讲正则表达式本身吧:有时候这么奇奇怪怪的一串却能让你少写很多的代码。下面整理了正则表达式的常用的语法:
写法 | 符合匹配规则的串 |
. | 任何字符 |
a? | a一次或一次也没有 |
a* | a零次或多次 |
a+ | a一次或多次 |
a{n}? | a恰好 n 次 |
a{n,}? |
a至少n次 |
a{n,m}? | a至少n次,但是不超过m次 |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] |
a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
关于java中的正则表达式的大概用法就总结道这里,还有很多细节的东西留在后面再作整理吧。