java 中的正则表达式
正则表达式匹配文本(或文本的一部分),或者不匹配。
*如果正则表达式匹配文本的一部分,那么我们可以找出它是哪一部分。
**如果正则表达式复杂,那么我们可以轻松地找出正则表达式的哪一部分与文本的哪一部分匹配。
第一个例子
正则表达式“ [az] + ”与文本中的所有小写字母匹配。
[az]表示从a到z的任何字符,包括+,表示“一个或多个”。
假设我们提供了一个字符串“代码2学习Java教程”。
在Java中如何做
首先,您必须编译模式:
导入java.util.regex。*;
模式p = Pattern.compile(“ [az] +”);
接下来,您必须通过向模式发送消息来为文本创建匹配器 :
Matcher m = p.matcher(“代码2学习Java教程”);
注意 :
Pattern和Matcher都没有公共构造函数,我们通过使用Pattern类中的方法来创建它。
模式类 :模式对象是正则表达式的编译表示。 Pattern类不提供公共构造函数。 要创建模式,必须首先调用其公共静态编译方法之一,然后再返回Pattern对象。 这些方法接受正则表达式作为第一个参数。
Matcher类 :Matcher对象是解释模式并针对输入字符串执行匹配操作的引擎。 与Pattern类一样,Matcher没有定义公共构造函数。 您可以通过在Pattern对象上调用matcher方法来获得Matcher对象。
完成上述步骤后,现在有了匹配器m ,我们可以检查是否找到了匹配项,如果匹配,则从哪个索引位置开始,等等。
如果模式与整个字符串匹配,则m.matches()返回true,否则返回false。
如果模式在字符串开头匹配,则m.lookingAt()返回true,否则返回false 。
如果pattern与文本的任何部分匹配,则m.find()返回true 。
寻找匹配的东西
匹配成功后, m.start()将返回匹配的第一个字符的索引, m.end()将返回匹配的最后一个字符的索引,再加上一个。
如果未尝试匹配,或者匹配失败,则m.start()和m.end()将抛出IllegalStateException
–这是一个RuntimeException,因此您不必捕获它
m.end()返回匹配的最后一个字符的索引似乎很奇怪,但这正是大多数String方法所需要的
–例如,“ 现在是时间 ” .substring(m.start() , m.end() )
将返回完全匹配的子字符串。
Java程序:
import java.util.regex.*;public class RegexTest {public static void main(String args[]) {String pattern = "[a-z]+";String text = "code 2 learn java tutorial";Pattern p = Pattern.compile(pattern);Matcher m = p.matcher(text);while (m.find()) {System.out.print(text.substring(m.start(), m.end()) + "*");}}
}
输出 :代码*学习* java *教程*。
附加方法
如果m是一个匹配器,则
– m.replaceFirst( replacement )返回一个新的String,其中与模式匹配的第一个子字符串已被替换
– m.replaceAll(replace )返回一个新的String,其中与模式匹配的每个子字符串均已替换为replace
– m.find( startIndex )从指定的索引开始查找下一个模式匹配 – m.reset()重置此匹配器 – m.reset( newText )重置此匹配器并为其提供新文本以进行检查(可以是String,StringBuffer或CharBuffer)
正则表达式语法
下表列出了Java中可用的所有正则表达式元字符语法:
子表达 | 火柴 |
---|---|
^ | 匹配行首。 |
$ | 匹配行尾。 |
。 | 匹配除换行符以外的任何单个字符。 使用m选项还可以使其与换行符匹配。 |
[…] | 匹配括号中的任何单个字符。 |
[^…] | 匹配任何不在方括号中的单个字符 |
\一个 | 整个字符串的开头 |
\ z | 整个字符串的结尾 |
\ Z | 整个字符串的结尾,但允许的最后一行终止符除外。 |
回覆* | 匹配0个或多个出现的前一个表达式。 |
重新+ | 匹配1个或多个前一个 |
回覆? | 匹配0或1个出现的前一个表达式。 |
重新{n} | 精确匹配前一个表达式的n次出现。 |
re {n,} | 匹配n个或多个出现的前一个表达式。 |
re {n,m} | 至少匹配n个,最多匹配m个先前的表达式。 |
a | b | 匹配a或b。 |
(回覆) | 对正则表达式进行分组并记住匹配的文本。 |
(?: 回覆) | 对正则表达式进行分组,而无需记住匹配的文本。 |
(?>重新) | 匹配独立模式而无需回溯。 |
\ w | 匹配单词字符。 |
\ W | 匹配非单词字符。 |
\ s | 匹配空格。 等效于[\ t \ n \ r \ f]。 |
\ S | 匹配非空格。 |
\ d | 匹配数字。 相当于[0-9]。 |
\ D | 匹配非数字。 |
\一个 | 匹配字符串的开头。 |
\ Z | 匹配字符串的结尾。 如果存在换行符,则匹配换行符。 |
\ z | 匹配字符串的结尾。 |
\G | 比赛结束点。 |
\ n | 向后引用捕获组号“ n” |
\ b | 放在方括号外时匹配单词边界。 放在方括号内时,匹配退格键(0x08)。 |
\ B | 匹配非单词边界。 |
\ n,\ t等 | 匹配换行符,回车符,制表符等。 |
\ Q | 转义(引号)所有字符,直到\ E |
\ E | 结束语以\ Q开头 |
参考:来自JCG合作伙伴的 Java正则表达式 代码2学习博客中的Farhan Khwaja。
翻译自: https://www.javacodegeeks.com/2012/02/regular-expressions-in-java-soft.html
java 中的正则表达式