@TOC正则表达式高级
正则表达式
(1): (?:pattern)
先看一下解释:匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。其实就是匹配pattern。经常和|搭配使用
例1:
字符串
abxoxcd
匹配模式1
a(?:b|x)
匹配结果1
ab
匹配模式2
(?:b|x)
匹配结果2
b
x
x
(2): (?=pattern)
正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始.
简单理解就是从正向匹配后面为pattern的字符串
例2
字符串
abxoxcd
匹配模式1
ab(?=xo)
匹配结果1
ab
匹配模式2
ab(?=xo)x
匹配结果2
abx
(?=xo)后面只能匹配一位,如(?=xo)xc没有匹配结果
(3): (?!pattern)
正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
简单理解为就是从正向匹配,后面不是pattern的字符串
例3:
字符串
abxoxcd
匹配模式1
a(?!xo)
匹配结果1
a
匹配模式2
cd(?!xo|bx)
匹配结果2
cd
(4): (?<=pattern)
反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反.
简单来说就是反向匹配,前面是pattern的字符串
例4
字符串
abxoxcd
匹配模式1
(?<=xo)xc
匹配结果1
xc
(5): (?<!pattern)
反向否定预查,与正向否定预查类似,只是方向相反.简单来说就是从反向匹配,前面不是pattern的字符串
字符串
abxoxcd
匹配模式1
(?<!xo)cd
匹配结果1
cd
总结:(?=pattern),(?!pattern),(?<=pattern),(?<!pattern)。这四种匹配模式最终匹配的结果都是pattern前面或者后面的内容,不包含pattern本身。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class javaRegex{
public static void main(Strings[] args){
String line = "This order was placed for QT3000! OK?";
String pattern = "(\\D*)(\\d+)(.*)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("Found value: " + m.group(0) );
System.out.println("Found value: " + m.group(1) );
System.out.println("Found value: " + m.group(2) );
System.out.println("Found value: " + m.group(3) );
} else {
System.out.println("NO MATCH");
}
}
}
import re
pattern = re.compile(ur'(.*)(?=先生|女士|小姐)')
str = u''
print(pattern.search(str))
print(pattern.findall(str))