解释 Java 正则表达式中的量词


Java 中的量词是特殊字符,允许你指定字符或字符组在正则表达式中出现的次数。最常见的量词是

  • *:其前面字符或字符集的一个或多个实例。

  • ?:其前面字符或字符集的零个或一个实例。

  • +:其前面字符或字符集的一个或多个实例。

  • {n}:其前面字符或字符集的 n 个实例。

  • {n,}:其前面字符或字符集至少出现 n 次。

  • {n,m}:其前面字符或字符集的 n 到 m 个实例。

量词可以是贪婪的、勉强匹配的或独占的。与勉强匹配的量词相反,贪婪量词尝试尽可能少地匹配输入文本。当独占量词匹配完整的输入文本时,它可能比量词指示的前面字符或组的实例更少。

量词类型

  • 贪婪量词

  • 勉强匹配量词

  • 独占量词

贪婪量词

贪婪量词是正则表达式中默认的量词类型。它们尝试匹配与模式匹配的最长可能的字符串。例如,正则表达式 a+ 将字符串 aaaa 匹配为 aaaa,而不是 a。

贪婪量词首先处理整个字符串。如果模式没有被完整字符串遵循,算法将消除最后一个字符并重试。直到字符串匹配模式或没有更多字符可以删除,此过程将继续进行。

while()

这段 Java 代码在输入“aaa”中查找模式“a+”。它查找此模式出现的位置,并显示每个匹配项的起始和结束位置。程序输出类似“模式找到范围从 0 到 2”的消息,指示它在输入中找到模式的位置。

算法

  • 步骤 1:使用 Pattern.compile() 方法编译正则表达式模式,模式为“a+”,并将其赋值给变量 p。

  • 步骤 2:使用模式 p 上的 matcher() 方法并传入输入字符串“aaa”,生成一个名为 m 的 Matcher 对象。

  • 步骤 3:启动一个 while 循环,用于迭代 Matcher 的匹配项。

  • 步骤 4:使用 Matcher m 的 find() 方法检查匹配项。

  • 步骤 5:如果找到匹配项,则执行循环内的代码。

  • 步骤 6:打印“模式找到范围从”与 m.start() 和“到”以及 (m.end()-1) 的连接。

  • 步骤 7:关闭 while 循环。

  • 步骤 8:结束 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”创建一个匹配器对象。匹配器对象用于查找输入字符串中模式的所有实例。对于模式的每次出现,代码都会打印消息“模式范围从 start() 到 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”创建一个匹配器对象。匹配器对象用于查找输入字符串中模式的所有实例。对于模式的每次出现,代码都会打印消息“模式范围从 start() 到 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 字符

  • a{3} 精确匹配三个 a 字符

更新于:2023年8月29日

377 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.