正则表达式
字符类
-
Java中用字符串
String.matches("正则表达式")
来匹配 -
中括号
[ ]
里面代表的是单个字符 -
^
取反:[^abc]
除了abc
其它单个字符都匹配(只能匹配单个字符) -
a-z
,-
取范围:-
[a-z]
匹配范围a-z之类的单个字符 -
[a-zA-Z]
还有一种并集的写法[a-z[A-Z]]
,实际功能操作无区别
-
-
&&交集:
- example1:
[a-z && [def]]
取a到e
和def
的交集 - example2:
[a-z && [^bc]]
取a到e
和非b和非c
的交集 - example3:
[a-z && [^m-p]]
取a到e
和非m到p
的交集
- example1:
预定义字符类
-
.
代表任何字符
,一个.
代表任意的一个字符(除了换行符\n
) -
\d
代表数字:[0-9]
- 一般写成
String regex = "\\d"
,还有一个\
为转义字符。以下也遵循此项
- 仅匹配一个字符
- 一般写成
-
\D
代表非数字:[^0-9]
-
\s
代表空白字符:[ \t\n\xOB\f\r]
-
\S
代表非空白字符:[^\s]
-
\w
代表单词字符:[a-zA-Z_0-9]
-
\W
代表非单词字符:[^\w]
数量词
-
X?
X,一次或一次也没有 -
X*
X,零次或多次 -
X+
X,一次或多次 -
X{n}
X,恰好 n 次 -
X{n,}
X,至少 n 次 -
X{n,m}
X,至少 n 次,但是不超过 m 次**注: **X可以是
字符
或者预定义字符
Java中正则表达式的应用
Java转义的特殊性
在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。
在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如Perl),一个反斜杠 \
就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\
代表其他语言中的一个 \
,这也就是为什么表示一位数字的正则表达式是 \\d
,而表示一个普通的反斜杠是 \\\\
。
例如:
public static void main(String[] args) {
String s = "I.....like......Java";
String regex = "\\.+";
String[] arr = s.split(regex);
for(int i = 0;i < arr.length; i++) {
System.out.println(arr[i]);
}
}
运行结果:
I
like
Java
字符串切割排序案例
需求:有一个如下字符串"91 27 46 38 50",编写代码实现输出 “27 38 46 50 91”(转化后为int数组)
import java.util.Arrays;
public class MainTest {
public static void main(String[] args) {
String s = "91 27 46 38 50";
String regex = " ";
String[] arr = s.split(regex);
Integer[] arr2int = new Integer[arr.length];
for(int i = 0; i < arr.length; i++) {
arr2int[i] = new Integer(arr[i]);
}
Arrays.sort(arr2int);
String afterSort = Arrays.toString(arr2int);
System.out.println(afterSort);
}
}
输出结果:
[27, 38, 46, 50, 91]
正则表达式的替换
String s = "zlqhexyz";
String regex = "[xyz]";
String s2 = s.replaceAll(regex, "o");
System.out.println(s2);
输出结果:
olqheooo
正则表达式的分组及其代码演示
正则表达式可以通过" () "来进行分组
如果没有显式为捕获组命名,即没有使用命名捕获组,那么需要按数字顺序来访问所有捕获组。在只有普通捕获组的情况下,捕获组的编号是按照“(”出现的顺序,从左到右,从1开始进行编号的 。
案例演示:
example1:
判断是否为叠词”高高兴兴,快快乐乐“
String regex = "(.)\\1(.)\\2";
System.out.println("高高兴兴".matches(regex));
System.out.println("快快乐乐".matches(regex));
true
true
example2:
判断是否为”快乐快乐,高兴高兴“
String regex = "(..)\\1";
System.out.println("快乐快乐".matches(regex));
System.out.println("高兴高兴".matches(regex));
true
true
example3:
String regex = "(..)\\1\\1";
System.out.println("快乐快乐快乐".matches(regex));
System.out.println("高兴高兴".matches(regex));
true
false
example4:
String regex = "(..)\\1\\1(..)\\2";
System.out.println("快乐快乐快乐".matches(regex));
System.out.println("快乐快乐快乐高兴高兴".matches(regex));
false
true
example5:
String regex = "(.)\\1{3}";
System.out.println("1234".matches(regex));
System.out.println("哈哈哈哈".matches(regex));
false
true
对比一下:
String regex = "(.){4}";
和上面有什么不同
String regex = "(.){4}";
System.out.println("1234".matches(regex));
System.out.println("哈哈哈哈".matches(regex));
true
true