解釋 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.