Pattern、Matcher、切割、替换等其他字符串操作:https://blog.csdn.net/weixin_43732798/article/details/100081039
标准字符集合
注意区分大小写,大写是相反的意思
字符 | 描述 |
---|---|
\d | 匹配0-9中的一个数字 |
\w | 任意一个字母或数字或下划线,即[A-Za-z0-9_] |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
. | 匹配任意一个字符(除了\n换行符),如果要匹配包括\n在内的所用字符,一般用[\s\S] |
例子
public class Main {
public static void main(String[] args) {
String str1 = "1230958";
String str2 = "1209x";
String regex1 = "\\d+";//匹配数字
String regex2 = "\\w+";//匹配字母、数字、下划线
System.out.println(str1.matches(regex1));//输出true
System.out.println(str1.matches(regex2));//输出true
System.out.println(str2.matches(regex1));//输出false
System.out.println(str2.matches(regex2));//输出true
}
}
自定义字符集合
[ ]方括号匹配方式,能够匹配方括号中任意一个字符
自定义集合 | 描述 |
---|---|
[ab5@] | 匹配“a”或“b”或“5”或“@” |
[^123] | 匹配除“1”,“2”,“3”之外的任意一个字符 |
[a-z] | 匹配小写字母a-z中的任意一个 |
[^A-Z0-3] | 匹配"A"-"Z","0"-"3"之外的任意一个字符 |
- 正则表达式的特殊符号如果被包含到中括号中,则失去特殊意义,除了^和-之外
- 标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合,比如[\d.\-+]将匹配:数字、小数点、-、+
例子
public class Main {
public static void main(String[] args) {
String str1 = "123456789";
String str2 = "234567891";
String str3 = "456789123";
String regex = "[123]\\d{8}";//匹配1或2或3开头的9位数的数字
System.out.println(str1.matches(regex));//输出true
System.out.println(str2.matches(regex));//输出true
System.out.println(str3.matches(regex));//输出false
}
}
转义字符
字符 | 描述 |
---|---|
\n | 换行符 |
\t | 制表符 |
\\ | 代表\本身 |
\^, \$, \(, \), \{, \}, \?, \+, \*, \|, \[, \] | 匹配这些字符本身 |
量词
修饰匹配次数
符号 | 描述 |
---|---|
{n} | 表达式重复n次 |
{m,n} | 表达式最少重复m次,最多n次 |
{m,} | 表达式至少重复m次 |
? | 匹配表达式0次或1次,相当于{0,1} |
+ | 表达式至少出现1次,相当于{1,} |
* | 表达式出现任意次,相当于{0,} |
- 贪婪模式:匹配字符越多越好,默认
- 非贪婪模式:匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个"?"号
例子
public class Main {
public static void main(String[] args) {
String str1 = "11112";
String regex1 = "1+?";//匹配一次“1”
String regex2 = "1+";//匹配多次“1”
//将匹配到的字符串用#代替
System.out.println(str1.replaceAll(regex1, "#"));//输出####2
System.out.println(str1.replaceAll(regex2, "#"));//输出#2
}
}
字符边界
字符 | 描述 |
^ | 与字符开始的地方匹配 |
$ | 与字符结束的地方匹配 |
\b | 匹配一个单词边界(表示空格、换行等) |
匹配模式
模式 | 描述 |
---|---|
Pattern.CASE_INSENSITIVE--忽略大小写模式 | 匹配时忽略大小写 |
Pattern.MULTILINE--多行模式 |
|
默认模式--单行模式 |
|
Pattern.CASE_INSENSITIVE--忽略大小写模式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str = "abcD";
Pattern p = Pattern.compile("[a-z]+");//匹配小写a-z
Matcher m = p.matcher(str);
System.out.println(m.matches());//输出false
p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);//忽略大小写
m = p.matcher(str);
System.out.println(m.matches());//输出true
}
}
Pattern.MULTILINE例子---多行模式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str="hello word\n"//字符串
+ "hello java\n"
+ "hello java\n";
System.out.println("字符串str:\n"+str);//输出字符串
System.out.println("-----------匹配字符串开头(单行模式)-----------");
Pattern p = Pattern.compile("^hello");
Matcher m = p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("-----------匹配字符串结尾(单行模式)-----------");
p=Pattern.compile("java$");
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("\n------------------分割线------------------\n");
System.out.println("-----------匹配字符串开头(多行模式)-----------");
p=Pattern.compile("^hello",Pattern.MULTILINE);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("-----------匹配字符串结尾(多行模式)-----------");
p=Pattern.compile("java$",Pattern.MULTILINE);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("\n------------------分割线------------------\n");
System.out.println("-----------匹配字符串开头(多行模式,仅匹配开头和结尾)-----------");
p=Pattern.compile("\\Ahello",Pattern.MULTILINE);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
System.out.println("-----------匹配字符串结尾(多行模式,仅匹配开头和结尾)-----------");
p=Pattern.compile("java\\Z",Pattern.MULTILINE);
m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+" 位置:["+m.start()+","+m.end()+"]");
}
}
}
输出
字符串str:
hello word
hello java
hello java
-----------匹配字符串开头(单行模式)-----------
hello 位置:[0,5]
-----------匹配字符串结尾(单行模式)-----------
java 位置:[28,32]
------------------分割线------------------
-----------匹配字符串开头(多行模式)-----------
hello 位置:[0,5]
hello 位置:[11,16]
hello 位置:[22,27]
-----------匹配字符串结尾(多行模式)-----------
java 位置:[17,21]
java 位置:[28,32]
------------------分割线------------------
-----------匹配字符串开头(多行模式,仅匹配开头和结尾)-----------
hello 位置:[0,5]
-----------匹配字符串结尾(多行模式,仅匹配开头和结尾)-----------
java 位置:[28,32]
匹配边界
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str = "abc 2ew e12 e";
Pattern p = Pattern.compile("\\b[A-Za-z].*?\\b");//匹配以字母开头的字符串
Matcher m = p.matcher(str);
while ( m.find() ) {
System.out.println(m.group()+" 位置:["+m.start()+", "+m.end()+"]");
}
}
}
输出
abc 位置:[0, 3]
e12 位置:[8, 11]
e 位置:[12, 13]
选择符和分组
表达式 | 作用 |
---|---|
|分支结构 | “或”的意思,匹配左边或右边 |
()捕获组 |
|
(?:Expression)非捕获组 | 一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以使用非捕获组来抵消使用()带来的副作用 |
反向引用(\n)
通过反向引用,可以对分组以捕获的字符串进行引用
例子
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str = "gogo toto nonono";
String regex = "([a-z]{2})\\1";//匹配ABAB形式的小写字母
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while ( m.find() ) {
System.out.println(m.group());
}
System.out.println("\n------------------分割线------------------\n");
regex = "([a-z]{2})\\1{2}";//匹配ABABAB形式的小写字母
p = Pattern.compile(regex);
m = p.matcher(str);
while ( m.find() ) {
System.out.println(m.group());
}
}
}
输出
gogo
toto
nono
------------------分割线------------------
nonono
预搜索(零宽断言)
- 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度
- 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符,是对位置的匹配。
- 正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的。如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度的,占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果而言的。
字符 | 描述 |
---|---|
(?=exp) | 自身出现的位置的后面能匹配表达式exp |
(?<=exp) | 自身出现的位置的前面能匹配表达式exp |
(?!exp) | 自身出现的位置的后面不能匹配表达式exp |
(?<!exp) | 自身出现的位置的前面不能匹配表达式exp |
例子
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String str = "going doing";
String regex = "[a-z]+(?=ing)";//匹配xxing形式的字符串
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while ( m.find() ) {
System.out.println(m.group());
}
}
}
输出
go
do