一,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 } }