public class Test4 { public static void main(String[] args) {
String str = "中国china2009";
String[] strs = str.split("(?<!^)(?:(?<![a-zA-Z])(?=[a-zA-Z])|(?<![0-9])(?=[0-9])|(?<![\u4e00-\u9faf])(?=[\u4e00-\u9faf]))");
for(int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
}
String str = "中国china2009";
String[] strs = str.split("(?<!^)(?:(?<![a-zA-Z])(?=[a-zA-Z])|(?<![0-9])(?=[0-9])|(?<![\u4e00-\u9faf])(?=[\u4e00-\u9faf]))");
for(int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
}
china
2009
(?:X) X,作为非捕获组
(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组 API也没看明白
//这个和上面的结果一样,这个好明白
import java.util.regex.*;
public class MyRegex2 {
public static void main(String[] args) {
String s="中国china2009";
/*
* 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
* [a-zA-Z]*:表示英文字母有0个或多个
* \\d*:表示数字有0个或多个
*/
Matcher m=Pattern.compile("([\u4e00-\u9fa5]*)([a-zA-Z]*)(\\d*)").matcher(s);
if(m.find()){
//第一对小括号表示第一组,第二对小括号表示第二组...
System.out.println(m.group(1));
System.out.println(m.group(2));
System.out.println(m.group(3));
}
}
}
(?idmsux-idmsux) Nothing,但是将匹配标志由 on 转为 off
(?idmsux-idmsux:X) X,作为带有给定标志 on - off 的非捕获组
(?=X) X,通过零宽度的正 lookahead
(?!X) X,通过零宽度的负 lookahead
(?<=X) X,通过零宽度的正 lookbehind
(?<!X) X,通过零宽度的负 lookbehind
(?>X) X,作为独立的非捕获组还不是很懂。。哎。。学无止境!
(?: //匹配后面的表达式,非捕获组(? <![a-zA-Z])(?=[a-zA-Z])|//前面不是字母,后面是字母
(? <![0-9])(?=[0-9])|//前面不是数字,后面是数字
(? <![\u4e00-\u9faf])(?=[\u4e00-\u9faf]) //前面不是中文,后面是中文
)")大约是以上的意思吧,请高手指教
(?:X) X,作为非捕获组
匹配 June 和 July 可以写成:
Ju(ne|ly)也可以写成
Ju(?:ne|ly)前者会把 ( ) 内的在匹配后保留在内存中,而后者不会。与捕获组 ( ) 的意思一样也是将其作为一组进行处理,在匹配完成后在内存中不保留匹配到的字符
(?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为
ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。
(?!X) 表示当前位置后面不允许出现的字符