正则表达式学习
文章目录
- 零宽度断言
- (?= X )
- (?! X )
- (?<= X )
- (?!= X )
- 模式修正符
- i
- x
- m
- s
- 捕获组与非捕获组
- 捕获组
- 非捕获组
零宽度断言
主要包括四种:(?= X ),(?! X ),(?<= X ),(?<! X )。前两种是位于表达式右侧,后两种是位于表达式左侧。带“=”的是匹配模式,带“!”是非匹配模式。
(?= X )
String testStr = "#5 abc 0#";
// 含义:数字,且该数字后面紧跟#
Pattern pattern = Pattern.compile("\\d(?=#)");
Matcher matcher = pattern.matcher(testStr);
// 0
while (matcher.find()) {
System.out.println(matcher.group(0));
}
(?! X )
String testStr = "#5 abc 0#";
// 含义:数字,且该数字后面不紧跟#
Pattern pattern = Pattern.compile("\\d(?!#)");
Matcher matcher = pattern.matcher(testStr);
// 5
while (matcher.find()) {
System.out.println(matcher.group(0));
}
(?<= X )
String testStr = "#5 abc 0#";
// 含义:数字,且该数字前面紧跟#
Pattern pattern = Pattern.compile("(?<=#)\\d");
Matcher matcher = pattern.matcher(testStr);
// 5
while (matcher.find()) {
System.out.println(matcher.group(0));
}
(?!= X )
String testStr = "#5 abc 0#";
// 含义:数字,且该数字前面不紧跟#
Pattern pattern = Pattern.compile("(?<!#)\\d");
Matcher matcher = pattern.matcher(testStr);
// 0
while (matcher.find()) {
System.out.println(matcher.group(0));
}
模式修正符
以(?)开头加上特殊字母(i/x/m/s)表示特定模式
i
忽略大小写
String testStr = "#5 Abc 0#";
// 含义:忽略abc 字母大小写
Pattern pattern = Pattern.compile("(?i)abc");
Matcher matcher = pattern.matcher(testStr);
// Abc
while (matcher.find()) {
System.out.println(matcher.group(0));
}
// 含义:不忽略abc 字母大小写
pattern = Pattern.compile("(?-i)abc");
matcher = pattern.matcher(testStr);
// 无
while (matcher.find()) {
System.out.println(matcher.group(0));
}
// 含义:只对a忽略字母大小写
pattern = Pattern.compile("(?i:a)bc");
matcher = pattern.matcher(testStr);
// Abc
while (matcher.find()) {
System.out.println(matcher.group(0));
}
x
忽略空白
String testStr = "#5 abc a b c 0#";
// 含义:忽略a b c 中空格
Pattern pattern = Pattern.compile("(?x)a b c");
Matcher matcher = pattern.matcher(testStr);
// abc
while (matcher.find()) {
System.out.println(matcher.group(0));
}
m
视作多行
String testStr = "#5 abc\nabc\n0#";
// 含义:.不包括换行符\n
Pattern pattern = Pattern.compile("(?m)abc.");
Matcher matcher = pattern.matcher(testStr);
//无
while (matcher.find()) {
System.out.println(matcher.group(0));
}
s
视作单行
String testStr = "#5 abc\nabc\n0#";
// 含义:将换行符\n视作普通字符
Pattern pattern = Pattern.compile("(?s)abc.");
Matcher matcher = pattern.matcher(testStr);
/* abc
abc
*/
while (matcher.find()) {
System.out.println(matcher.group(0));
}
捕获组与非捕获组
捕获组
以()作为捕获组的分割符,以(?:)作为非捕获组的分割符。
捕获组中:group(0)代表全部;从左至右的”(“决定捕获组的序号。
String testStr = "ppsd 12#Amm 3#sa";
// 含义:12#Amm
Pattern pattern = Pattern.compile("((12)(#A))mm");
Matcher matcher = pattern.matcher(testStr);
/*
12#Amm
12#A
12
#A
*/
while (matcher.find()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
}
非捕获组
以(?:)开头,不具有捕获组序号。
String testStr = "ppsd 12#Amm 3#sa";
// 含义:12#Amm
Pattern pattern = Pattern.compile("((?:12)(#A))mm");
Matcher matcher = pattern.matcher(testStr);
/*
12#Amm
12#A
#A
*/
while (matcher.find()) {
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
}
还没有评论,来说两句吧...