总结:
(1)
. 匹配除换行符以外的任意字符
\w 匹配字母或数字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束
(2)
如果你想查找特殊代码本身的话,比如你查找.,或者*,就出现了问题:你没法指定它们,因为它们会被解释成其它的意思。
这时你就必须使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.
(3)
*重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
(4)
\W匹配任意不是字母和数字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
(5)
(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里
(?:exp) 匹配exp,不捕获匹配的文本
位置指定
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释
(?#comment) 这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释
(6)
*?重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
给个例子:
Java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()
".*?(?=\\()"
".*?(?=\()"
".*(?=\\()"
".*(?=\()"
代码:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StaticStuff {
public static void main(String[] args) {
String text = "北京市(海淀区)(朝阳区)(西城区)";
Pattern pattern = Pattern.compile(".*?(?=\\()" );
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}
BD会报错的 :Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ ) 需要使用\\\
C的运行结果是:北京市(海淀区)(朝阳区)
A的运行结果是:北京市
A和C的区别是:
前面的.*?是非贪婪匹配的意思, 表示找到最小的就可以了(?=Expression) 顺序环视,(?=\\()就是匹配正括号
1.什么是正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。2.编程中如何区分两种模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
量词:{m,n}:m到n个
*:任意多个
+:一个到多个
?:0或一个然后这道题目.表示除\n之外的任意字符*表示匹配0-无穷+表示匹配1-无穷(?=Expression) 顺序环视,(?=\\()就是匹配正括号懒惰模式正则:
src=".*? (?=\\()) "结果:北京市因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。