一,Java正则表达式的基本知识
1,方括号:方括号中指定的单个字符才参与匹配
public class Test {
public static void main(String[] args) {
System.out.println("a".matches("[abc]")); //true
System.out.println("abc".matches("[abc]")); //false
System.out.println("a".matches("[a-c]")); //true
}
}
2,逻辑运算符
符号 | 说明 |
| | 或运算符,参见示例一 |
(隐式) | 并运算符,a并b等价于ab |
&& | 交运算符,参见示例二 |
^ | 非运算符,参见示例三 |
示例一:如果想要匹配多个字符,则不能使用[],而要使用()
public class Test {
public static void main(String[] args) {
System.out.println("aa".matches("(a|aa)")); //true
System.out.println("aa".matches("[a|aa]")); //false
}
}
示例二:&&一定要在[]内部使用,否则会被认为是匹配2个连续的&符号
public class Test {
public static void main(String[] args) {
System.out.println("a&&b".matches("a&&b")); //true
System.out.println("b".matches("[a-b&&b]")); //true,等价于[b]
System.out.println("a".matches("[a-f&&[^bcdef]]")); //true,等价于[a]
}
}
示例三:^一定要在[]内部使用,否则将被认作起始边界符
public class Test {
public static void main(String[] args) {
System.out.println("c".matches("[^a]")); //true
System.out.println("c".matches("^a")); //false
System.out.println("c".matches("[^a-c]")); //false
}
}
3,表示匹配次数的符号
符号 | 匹配次数 |
* | 0次或多次 |
+ | 1次或多次 |
? | 0次或1次 |
{n} | 恰好n次 |
{n,} | 至少n次 |
{n,m} | 至少n次,但不超过m次 |
4,预定义字符
符号 | 等价正则表达式 |
.(句点符号) | 匹配任意单个字符,包括空格符、制表符和换行符,参见示例四 |
\d | [0-9] |
\D | [^0-9] |
\w | [a-zA-Z_0-9] |
\W | [^a-zA-Z_0-9] |
\s | [\t\n\x0B\r\f](\t:水平制表符,\n:换行符,\x0B:垂直制表符,\r:回车符,\f:换页符) |
\S | [^\t\n\x0B\r\f] |
示例四:
public class Test {
public static void main(String[] args) {
//Tab
System.out.println("a b".matches("a.b")); //true
System.out.println("ab".matches("a.b")); //false
System.out.println("aabb".matches("a.b")); //false
}
}
5,边界字符
符号 | 含义 |
^ | 行的开头 |
$ | 行的结束 |
Pattern p = Pattern.compile("^\\d*$");
等价于:
Pattern p = Pattern.compile("\\d*");
二,Java正则表达式相关对象
java.util.regex.Pattern:Pattern的实例对象是不可变对象,线程安全
java.util.regex.Matcher:Matcher的实例对象是非线程安全的
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d*");
Matcher m = p.matcher("123");
System.out.println(m.matches());
}
}
上面的代码等价于:
public class Test {
public static void main(String[] args) {
boolean result = Pattern.matches("\\d*", "123");
System.out.println(result);
}
}
由于无法重用已编译的模式,故对于重复的匹配效率不高
然后再来看下String类的matches方法:
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
在有些情况下会希望正则表达式不区分大小写:
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("http",Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("HTtp");
System.out.println(m.matches()); //true
}
}