(?:X) | X,作为非捕获组 |
(?idmsux-idmsux) | Nothing,但是将匹配标志idmsux on - off |
(?idmsux-idmsux:X) | X,作为带有给定标志 i d m s u x on - off |
(?=X) | X,通过零宽度的正 lookahead |
(?!X) | X,通过零宽度的负 lookahead |
(?<=X) | X,通过零宽度的正 lookbehind |
(?X) | X,通过零宽度的负 lookbehind |
(?>X) | X,作为独立的非捕获组 |
1 | 字面值转义 | \x |
---|---|---|
2 | 分组 | [...] |
3 | 范围 | a-z |
4 | 并集 | [a-e][i-u] |
5 | 交集 | [a-z&&[aeiou]] |
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
组零始终代表整个表达式。
之所以这样命名捕获组是因为在匹配中,保存了与这些组匹配的输入序列的每个子序列。捕获的子序列稍后可以通过 Back 引用在表达式中使用,也可以在匹配操作完成后从匹配器获取。
与组关联的捕获输入始终是与组最近匹配的子序列。如果由于量化的缘故再次计算了组,则在第二次计算失败时将保留其以前捕获的值(如果有的话)例如,将字符串"aba" 与表达式(a(b)?)+ 相匹配,会将第二组设置为"b"。在每个匹配的开头,所有捕获的输入都会被丢弃。
以 (?) 开头的组是纯的非捕获 组,它不捕获文本,也不针对组合计进行计数。
// 按指定模式在字符串查找
String line = "AK47! OK?";
String pattern = "([A-Z]+)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
int groupCount=m.groupCount();
if (m.find()) {
for(int i=0;i<=groupCount;i++){
System.out.println("group("+i+"):"+m.group(i));
}
} else {
System.out.println("NO MATCH!");
}
}
// 按指定模式在字符串查找
String text = "AK47! 12ksdjfk445OK?";
String regex = "\\d+";
// 创建 Pattern 对象
Pattern r = Pattern.compile(regex);
// 现在创建 matcher 对象
Matcher m = r.matcher(text);
System.out.println("input:"+text);
System.out.println("regex:"+regex+"\n");
while(m.find()) {
System.out.println("匹配到:"+m.group()+"\t开始位置为:"+m.start()+"\t结束位置为:"+m.end());
}
// 按指定模式在字符串查找
String text = "47AN";
String regex = "\\d+";
// 创建 Pattern 对象
Pattern r = Pattern.compile(regex);
// 现在创建 matcher 对象
Matcher m = r.matcher(text);
System.out.println("input:"+text);
System.out.println("regex:"+regex+"\n");
System.out.println("lookingAt:"+m.lookingAt());
System.out.println("matches:"+m.matches());
// 按指定模式在字符串查找
String text = "AN47 java2 C# .Net5";
String regex = "\\d+";
// 创建 Pattern 对象
Pattern r = Pattern.compile(regex);
// 现在创建 matcher 对象
Matcher m = r.matcher(text);
System.out.println("input:"+text);
System.out.println("regex:"+regex+"\n");
System.out.println("replaceAll替换后为:"+m.replaceAll("0"));
System.out.println("replaceFirst替换后为:"+m.replaceFirst("0"));
// 按指定模式在字符串查找
String text = "AN47 java2 C# .Net5 php";
String regex = "\\d+";
// 创建 Pattern 对象
Pattern r = Pattern.compile(regex);
// 现在创建 matcher 对象
Matcher m = r.matcher(text);
System.out.println("input:"+text);
System.out.println("regex:"+regex+"\n");
StringBuffer result=new StringBuffer();
while(m.find()){
m.appendReplacement(result, "0");
}
// m.appendTail(result);
System.out.println("替换后为:"+result);
}
public static void main(String args[]){
String input="20161209,20161210,20161211";
forMat1(input, '-');
}
public static void forMat1(String input,char separator){
String regex="(\\d{4})(\\d{2})(\\d{2})";
Matcher m=Pattern.compile(regex).matcher(input);
while(m.find()){
System.out.print(m.group()+"\t格式化后为:");
System.out.println(m.group(1)+separator+m.group(2)+separator+m.group(3));
}
}
public static void main(String args[]){
String input="20161209,20161210,20161211";
forMat2(input, '-');
}
public static void forMat2(String input,char separator){
String regex="(\\d{4})(\\d{2})(\\d{2})";
String format="$1"+separator+"$2"+separator+"$3";
Matcher m=Pattern.compile(regex).matcher(input);
while(m.find()){
System.out.print(input+"\t格式化后为:");
System.out.println(m.replaceAll(format));
}
}
运行结果: