Java----正则表达式简单记录
Pattern
-
pattern.matches(regex, text)
返回boolean对象,表示一个句子是否符合正则表达式! -
Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text)
其也有一个matches方法判断是否匹配!
-
Pattern.split() 方法可以用正则表达式作为分隔符来断句。
Pattern pattern = Pattern.compile(patternString); String[] split = pattern.split(text);
-
Pattern.pattern()其实就是获取编译了的regrex!即compile方法的参数!
Matcher
java.util.regex.Matcher 类用于匹配一段文本中多次出现一个正则表达式,Matcher 也适用于多文本中匹配同一个正则表达式。构造方式:
String text =
"This is the text to be searched " +
"for occurrences of the http:// pattern.";
String patternString = ".*http://.*";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
-
boolean matches = matcher.matches();
-
lookingAt() 与matches() 方法类似,最大的不同是,lookingAt()方法对文本的开头匹配正则表达式;而
matches() 对整个文本匹配正则表达式。
-
find() + start() + end()
find() 方法用于在文本中查找出现的正则表达式,文本是创建Matcher时,通过 Pattern.matcher(text) 方法传入的。如果在文本中多次匹配,find() 方法返回第一个,之后每次调用 find() 都会返回下一个。
start() 和 end() 返回每次匹配的字串在整个文本中的开始和结束位置。实际上, end() 返回的是字符串末尾的后一位,这样,可以在把 start() 和 end() 的返回值直接用在String.substring() 里。
-
reset()
reset() 方法会重置Matcher 内部的 匹配状态。当find() 方法开始匹配时,Matcher 内部会记录截至当前查找的距离。调用 reset() 会重新从文本开头查找。
reset(CharSequence) 方法. 这个方法重置Matcher,同时把一个新的字符串作为参数传入,用于代替创建 Matcher 的原始字符串。
-
group()
假设想在一个文本中查找URL链接,并且想把找到的链接提取出来。当然可以通过 start()和 end()方法完成。但是用group()方法更容易些。
使用group(int groupNo) 方法访问一个分组。一个正则表达式可以有多个分组。每个分组由一对括号标记。想要访问正则表达式中某分组匹配的文本,可以把分组编号传入 group(int groupNo)方法。
group(0) 表示整个正则表达式,要获得一个有括号标记的分组,分组编号应该从1开始计算。
((John) (.+?))
当遇到嵌套分组时, 分组编号是由左括号的顺序确定的。上例中,分组1 是那个大分组。分组2 是包括John的分组,分组3 是包括 .+? 的分组。当需要通过groups(int groupNo) 引用分组时,了解这些非常重要。
-
replaceAll() + replaceFirst()
replaceAll() 和 replaceFirst() 方法可以用于替换Matcher搜索字符串中的一部分。replaceAll() 方法替换全部匹配的正则表达式,replaceFirst() 只替换第一个匹配的。
在处理之前,Matcher 会先reset()重置。所以这里的匹配表达式从文本开头开始计算。两个方法返回替换后的文本!
-
appendReplacement() + appendTail()
appendReplacement() 和 appendTail() 方法用于替换输入文本中的字符串短语,同时把替换后的字符串附加到一个 StringBuffer 中。
当find() 方法找到一个匹配项时,可以调用 appendReplacement() 方法,这会导致输入字符串被增加到StringBuffer 中,而且匹配文本被替换。 从上一个匹配文本结尾处开始,直到本次匹配文本会被拷贝。
appendReplacement() 会记录拷贝StringBuffer 中的内容,可以持续调用find(),直到没有匹配项。
直到最后一个匹配项目,输入文本中剩余一部分没有拷贝到 StringBuffer. 这部分文本是从最后一个匹配项结尾,到文本末尾部分。通过调用 appendTail() 方法,可以把这部分内容拷贝到 StringBuffer 中.
String text = "John writes about this, and John Doe writes about that," + " and John Wayne writes about everything." ; String patternString1 = "((John) (.+?)) "; Pattern pattern = Pattern.compile(patternString1); Matcher matcher = pattern.matcher(text); StringBuffer stringBuffer = new StringBuffer(); while(matcher.find()){ matcher.appendReplacement(stringBuffer, "Joe Blocks "); System.out.println(stringBuffer.toString()); } matcher.appendTail(stringBuffer); System.out.println(stringBuffer.toString());
注意我们在while循环中调用appendReplacement() 方法。在循环完毕后调用appendTail()。 代码输出如下:
Joe Blocks Joe Blocks about this, and Joe Blocks Joe Blocks about this, and Joe Blocks writes about that, and Joe Blocks Joe Blocks about this, and Joe Blocks writes about that, and Joe Blocks writes about everything.
基本语法
-
字符 : 作用是简单的匹配一个确定的字符。可以在表达式中使用任意英文字符。也可以使用字符对于的8进制,16进制或unicode编码表示。
-
字符分类,用[]表示匹配中括号中的任意字符比如: [Jj]ohn
-
预定义字符:比如 \d 表示数字,\s 表示空白字符,\S表示非空白字符
-
边界匹配:\w 匹配一个单词,^匹配行首,$ 匹配行尾。
-
量词匹配:*表示0次或多次,+表示一次或多次,?表示零次或一次
量词匹配的三种模式,饥饿模式(.*?),贪婪模式(.*),独占模式(.*+)!
饥饿和贪婪略!
贪婪和独占模式的区别:
John went for a walk, and John fell down, and John hurt his knee.
使用
John.*hurt
即贪婪模式来匹配能匹配到John went for a walk, and John fell down, and John hurt
,如果用独占模式的话会直接John.*+
匹配整个句子而忽略hurt导致匹配不成功! -
逻辑操作符
正则表达式支持少量的逻辑运算(与,或,非)。
与操作是默认的,表达式 John ,意味着J 与 o与h与n。
或操作需要显示指定,用 | 表示。例如表达式 John|hurt 意味着John 或 hurt 。
-
字符
. 任意英文字母 \ 反斜杠, 单独的反斜杠做为转义字符,与其他特殊字符一起使用。如果想匹配反斜杠本身,需要转义。两个反斜杠实际匹配一个反斜杠n字符的8进制表示.n 在0至7之间取值 nn 字符的8进制表示.n 在0至7之间取值 mnn 字符的8进制表示. m 在0至3之间取值, n 在0至7之间取值 \xhh 字符的16进制表示. \uhhhh 字符的16进制表示 0xhhhh. 对应unicode 编码字符 \t 缩进符. \n 换行符 (unicode: ‘\u000A’) \r 回车符 (unicode: ‘\u000D’) \f 制表符 (unicode: ‘\u000C’) \a 警报(铃声)字符 (unicode: ‘\u0007′) \e 转义符 (unicode: ‘\u001B’) \cx 控制符 x -
字符分类
[abc] 匹配 a, 或 b 或 c [^abc] 匹配不是a,b,c 的字符,是否定匹配 [a-zA-Z] 匹配a 到 z ,A到Z 直接的字符,是范围匹配 [a-d[m-p]] 匹配a到d之间字符或 m到p之间字符,是并集匹配 [a-z&&[def]] 匹配 d, e, 或 f. 是交集匹配 (这里是在范围 a-z和字符def之间取交集). [a-z&&[^bc]] 匹配a-z 之间所有字符,排除bc的字符。是减法匹配 [a-z&&[^m-p]] 匹配a-z 之间所有字符,排除m-p之间的字符是减法匹配 -
内置字符分类
. | 匹配任意一个字符,根据创建Pattern是传入的标志,可能匹配行结尾符 |
---|---|
\d | 匹配任意数字 [0-9] |
\D | 匹配任意非数字 [^0-9] |
\s | 匹配任意空白符 (空格, 缩进, 换行,回车) |
\S | 匹配任意非空白符 |
\w | 匹配任意单词 |
\W | 匹配任意非单词 |
边界匹配
^ | 匹配行首 |
---|---|
$ | 匹配行尾 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\A | 匹配文本开头 |
\G | 匹配前一匹配项结尾 |
\Z | Matches the end of the input text except the final terminator if any |
\z | 匹配文本结尾 |