Java 正则表达式

来源:互联网 发布:网络教育学校有区别吗 编辑:程序博客网 时间:2024/05/18 01:22
  • Java 正则表达式 菜鸟教程

Java 中的 \

在普通字符串中 \ 表示转义,比如\n表示换行,\"表示去掉双引号的特殊意义,\\表示一个反斜杠
以上这三种情况中的最后一种在正则表达式中有不同的意义
在作为正则表达式的字符串中\\表示正则表达式的特殊字符,比如\\d表示数字,等同于[0-9]。而如果需要输入一个无特殊意义的反斜杠,那就要写四个反斜杠\\\\

创建模式 Pattern 和 Matcher

Pattern 使用静态方法,而不是构造器来创建 Pattern 对象
Pattern.compile(String regex):regex 是一个正则表达式
Pattern.compile(String regex, int flags)
flags 常用的值
Pattern.CASE_INSENSITIVE:忽略大小写
Pattern.MULTILINE^$可以表示行首与行尾,原本它们值表示输入字符串的开头与结尾,但是我们需要匹配的字符串中可能带有换行符,所以需要用它来匹配行首与行尾

另一种简单的写法是把 flags 写在 regex 中,上边两个旗标分别等价于 "(?i)String"(?m)string

多个旗标连用:Pattern.CASE_INSENSITIVE | Pattern.MULTILINE或者(?im)

Pattern 对象的 matcher 方法可以用来创建 Matcher 对象
matcher(CharSequence input):input 表示被匹配的字符串

Matcher 对象的方法

查找

find():找到与给定的正则表达式匹配的字符子串就返回 true
find(int position):从指定位置开始查找,可以用来重置 Matcher 对象

有点类似于 cursor,每次查找后指针后移,下次查找就不是从头开始了

lookingAt():从字符串的头部开始匹配,只要字符串符合正则表达式就返回 true,即使这个字符串很长,后面还有好多不符合正则表达式的字符
matches():正则表达式与整个字符串匹配,只有当整个字符串完全符合正则表达式时才返回 true

替换

replaceFirst(String replacement):替换第一个匹配的字符子串
使用该方法前不用事先使用 find 方法,该方法被调用多次后仍旧只有第一个字符子串被替换
replaceAll(String replacement):替换所有,同样不用事先 find

索引

使用这些方法前需要先使用 find 方法

start():匹配到的字符串的开头的索引,整个被匹配的字符串的索引从 0 开始
start(int group)
end()
end(int group)

取子串

事先 find

group()
group(int group)

Java 正则表达式中组的用法应该和 Linux 中的差不多,但是我在 Linux 中很少用组,所以这里记一下
Java组的顺序是由左括号决定的,第一个左括号到与其匹配的右括号之间的为第一个组
第 0 个组就是指整个正则表达式,也就是说 matcher 对象的group()方法等同于group(0)
如果整个正则表达式的最外面用括号括起来,那group(1)也等同于group(0)
组里面可以使用【或】来匹配几种可能的情况(HELLO|world),匹配 HELLO 或者 world
在正则表达式中可以使用\\number来引用前面的组,比如(hello)(\\1),这里的\\1就是指 hello,当然也可以直接写成 hello,而在 replaceFirst 等替换方法的参数中,可以使用$number来代表某一个组

组的使用

替换第2个匹配到的字符串

很可惜 Java 没有现成的方法来实现这个功能,只有替换第一个匹配的字符串或者全部替换。要实现这个功能可以借助组的功能

比如有一个字符串中有三个 hello,我希望把第二个 hello 替换成 XIEJIAMING

Pattern p =Pattern.compile("(hello)(.*?)(hello)");Matcher m = p.matcher("hello world, hello --- hello xxxxxx microsoft end");System.out.println(m.replaceAll("$1$2XIEJIAMING"));

输出效果如下:hello world, XIEJIAMING --- hello xxxxxx microsoft end


字符串对象支持正则表达式的方法

replaceFirst("regex","replacement") replaceAll("regex","replacement")

String 中有一个replace(CharSequence target, CharSequence replacement)方法,可以替换所有匹配到的子串,但是不支持正则表达式

String[] split(String regex):切割字符串
String[] split(String regex, int limit):limit指的是返回后的 String 数组的大小,1就是匹配0次,返回数组大小为1;5就是尽可能匹配四次,返回的数组最大为5;如果 limit 为非正数,则尽可能多的匹配

Pattern 对象同样支持 split 方法,不同的是它的 split 方法接受的是表输入的字符串,而不是表正则表达式的字符串

原创粉丝点击