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

javaobject oriented programmingprogramming更新于 2025/2/15 23:40:17

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() 和 " to " 和 (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"。 matcher 对象的 start() 和 end() 方法返回输入字符串中匹配的起始和终止索引。

算法

  • 步骤 1:通过编译正则表达式"a+?"创建一个 Pattern 对象。

  • 步骤 2:通过将输入字符串"aaa"传递给 Matcher 对象来创建一个 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{3} 匹配三个 a 字符


相关文章


有用资源