在Java正则表达式中解释量词
在Java中,量词是一种特殊字符,允许你指定字符或字符组在正则表达式中可以出现的次数。最常见的量词有:
- *:出现在它前面的字符或字符集的一个或多个实例。
-
?:出现在它前面的字符或字符集零次或一次。
-
+:出现在它前面的字符或字符集的一个或多个实例。
-
{n}:特定数量(n个)的出现在它前面的字符或字符集。
-
{n,}:出现在它前面的字符或字符集至少出现n次。
-
{n,m}:出现在它前面的字符或字符集出现n到m次。
量词可以是贪婪的、勉强的或拥有的。与勿扰的量词相反,贪婪的量词试图尽可能少地匹配输入文本。当拥有的量词匹配完整的输入文本时,可能会比量词指示的字母或组的实例少。
量词类型
- 贪婪量词
-
勉强量词
-
拥有量词
贪婪量词
贪婪量词是正则表达式中默认的量词类型。它们试图匹配与模式最长可能匹配的字符串。例如,正则表达式a+将以aaaa的形式匹配字符串aaaa,而不是a。
贪婪量词首先处理整个字符串。在情况下,如果模式不后随完整字符串,算法将消除最后一个字符并重试。直到字符串与模式匹配或没有更多字符可以移除,这个过程将继续进行。
while()
这段Java代码在输入”aaa”中寻找模式”a+”。它找到了这个模式出现的位置,并显示了每个匹配的起始和结束位置。程序输出类似于”Pattern found ranging from 0 to 2″的消息,指示它在输入中找到了模式的位置。
算法
- 第一步:使用Pattern.compile()方法和模式”a+”编译正则表达式,并将其赋值给变量p。
-
第二步:通过在模式p上使用matcher()方法,并传入输入字符串”aaa”,生成一个名为m的Matcher对象。
-
第三步:启动一个while循环来遍历Matcher的匹配项。
-
第四步:使用Matcher m的find()方法检查是否匹配。
-
第五步:如果找到匹配项,则在循环内执行代码。
-
第六步:打印”Pattern found ranging from”和m.start()的结果以及” to “和(m.end()-1)的结果的拼接字符串。
-
第七步:关闭while循环。
-
第八步:结束main方法和TLP类。
示例
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TLP
{
public static void main(String[] args)
{
Pattern p = Pattern.compile("a+");
Matcher m = p.matcher("aaa");
while (m.find())
System.out.println("Pattern found ranging from " + m.start() +
" to " + (m.end()-1));
}
}
输出
Pattern found ranging from 0 to 2
不情愿的修饰符
非贪婪修饰符与贪婪修饰符相反。它们试图匹配最短的满足模式的字符串。例如,正则表达式a+?将字符串aaaa匹配为a,而不是aaaa。
while()
该代码创建一个正则表达式模式,它匹配一个或多个a字符,但也允许匹配零个a字符。然后,代码创建一个用于输入字符串”aaa”的匹配器对象。匹配器对象用于在输入字符串中查找模式的所有实例。对于每个模式的出现,代码打印消息”Pattern ranging from start() to end()-1″。匹配器对象的start()和end()方法返回匹配在输入字符串中的开始和结束索引。
算法
- 步骤1:通过编译正则表达式”a+?”创建一个Pattern对象。
-
步骤2:通过将输入字符串”aaa”传递给它来创建一个Matcher对象。
-
步骤3:进入一个循环来查找并打印输入字符串中的匹配项。
-
步骤4:结果将显示在输入字符串”aaa”中找到的匹配模式的起始和结束索引。
示例
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TLP
{
public static void main(String[] args)
{
Pattern p = Pattern.compile("a+?");
Matcher m = p.matcher("aaa");
while (m.find())
System.out.println("Pattern ranging from " + m.start() +
" to " + (m.end()-1));
}
}
输出
Pattern ranging from 0 to 0
Pattern ranging from 1 to 1
Pattern ranging from 2 to 2
占有性量词
像贪婪量词一样,占有性量词匹配尽可能多的字符。与贪婪量词相反,占有性量词不会尝试从字符串末尾移除字符,如果整个字符串不符合模式,则不会移除,这与贪婪量词相反。
while()
这段代码创建了一个正则表达式模式,用于匹配两个字符c和++的序列。然后,这个示例创建一个匹配器对象,用于输入字符串”ccc”。匹配器对象用于查找输入字符串中模式的所有实例。对于每个模式的出现,代码将打印消息”Pattern ranging from start() to end()-1″。
算法
- 步骤1:声明名为TLP的主类。
-
步骤2:通过编译正则表达式”c++”来创建一个Pattern对象。
-
步骤3:通过将输入字符串”ccc”传递给它来创建一个Matcher对象。
-
步骤4:进入循环,查找并打印输入字符串中的匹配项。
-
步骤5:当代码运行时,输入字符串”ccc”将显示匹配模式”c++”的起始和结束索引。
示例
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TLP
{
public static void main(String[] args)
{
Pattern p = Pattern.compile("c++");
// Making an instance of Matcher class
Matcher m = p.matcher("ccc");
while (m.find())
System.out.println("Pattern ranging from from " + m.start() +
" to " + (m.end()-1));
}
}
输出
Pattern ranging from from 0 to 2
结论
在Java正则表达式中,量词表示字符或字符集在匹配中可以出现的次数。量词有三种变体:占有型、犹豫型和贪婪型。
占有型量词匹配恰好提供的字符数。贪婪型量词会尽可能地匹配尽量多的字符。而犹豫型量词则匹配尽量少的字符。
以下是Java正则表达式中量词的一些示例:
-
a+匹配一个或多个a字符
-
a*匹配零个或多个a字符
-
a?匹配一个a字符或者没有字符
-
a{3}恰好匹配三个a字符