//编译正则表达式,这样子可以重用模式。
Pattern p = Pattern.compile("a*b");
// 用模式检查字符串
Matcher m = p.matcher("aaaaab");
//检查匹配结果
boolean b = m.matches();
上面的使用太繁琐,一般使用场景我们只需要匹配检查一次即可。所以可以省略为如下方式:
boolean b = Pattern.matches("a*b", "aaaaab");
另外正则运用在字符串上,上面那样普通使用还是麻烦,因此在字符串对象里提供快速调用的方法(matches/split/replace), 如上面的matches只需要这样:
"aaaaab".matches("a*b")
字符串matches和Pattern.matches的源码如下,可以发现其实内部还是用了第一种方式的。
//String对象成员matches方法
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
//Pattern的matches方法
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
# 字符类
[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](减去)
String regex = "1[358]\\d{9}" ;
boolean flag="15322510408".matches(regex);
String[] str = string.split(regex) ;
如下简单例子: //按一个或多个空格切割
String name = "aaaaa _haha" ;
String regex =" +" ;
String[] strs = name.split(regex) ;
"abctttttttcdemmmmmmfglllllll-------"
切割结果为 [abc,cde,fg]
, 这里就需要引入组的概念了.((A)(B(C)))
中,存在四个这样的组:
((A)(B(C)))
(A)
(B(C))
(C)
\\1
(第一个\
用来转义)或者$1
, 因此上面按重复切割代码如下: //按重复字符切割
String name = "abctttttttcdemmmmmmfglllllll-------" ;
String regex ="(.)\\1+" ;
String[] strs = name.split(regex) ;
string.replace(char oldChar, char newChar)
和 string.replace(CharSequence target, CharSequence replacement)
替换单个字符,不使用到正则string.replaceAll(String regex, String replacement)
替换字符串,使用到正则string.replaceFirst(String regex, String replacement)
替换匹配的第一个字符串,使用到正则abctcdemfgl-
, 代码如下String name = "abctttttttcdemmmmmmfglllllll-------" ;
String regex ="(.)\\1+" ;
String result = name.replaceAll(regex, "$1");
String name = "13800138000" ;
String regex ="(\\d{3}) (\\d{4}) (\\d{4})" ;
String result = name.replaceAll(regex, "$1****$3");
String name = "13800138000" ;
String regex ="(\\d{3}) \\d{4})(\\d{4})" ;
String result = name.replaceAll(regex, "$1****$2");
complie
返回pattern对象matcher
方法返回 matcher匹配器对象matcher.find()
, 指针会移动到下一个匹配的字符串, 如果有返回true. 通过**matcher.group();
**等方法 获取当前指针匹配的字符串 String name = "13800138000" ;
String regex ="(\\d{3})(\\d{4})(\\d{4})" ;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(name);
String result = null;
if(matcher.find()) { //如果需要取所有,可以使用while
//取第二组的数据。
result = matcher.group(2);
}
p.s 正则在java等的api文档中写得很详细了,有什么细节例如匹配规则等建议看文档,会更详细,