正規表示式與 Kleene 定理
Kleene 星號(Kleene star)
/ KLAY-nee /
想像一個你可以隨意按壓任意次數的橡皮章,包括完全不按。Kleene 星號正是這個「想重複幾次就重複幾次,包含零次」的運算子。它讓正規表示式能用有限的公式描述無限的字串家族,例如「任意多個數字」。
若 R 是正規表示式,它的 Kleene 星號(在 R 後面寫一個星號)標示由 L(R) 中取出零個或多個字串串接而成的每個字串。串接零個複本得到空字串 ε(epsilon),所以無論 R 是什麼,ε 永遠都在加星後的語言裡。例如 a* 標示 { ε, a, aa, aaa, ... },而 (ab)* 標示 { ε, ab, abab, ababab, ... }。集合 L(R)* 等於對所有 n ≥ 0、把 L(R) 與自身串接 n 次後取聯集。
有兩個事實常令新手吃驚。第一,任何非空樣式的星號都標示一個無限語言,但這個語言仍是正規的:「正規」意指「能被有限自動機識別」,而非「有限」。第二,星號連用兩次並不會產生新東西:(R*)* 標示與 R* 相同的語言,因為一旦你能重複零次或多次,再賦予一次這個能力也不增添什麼。這條雙星定律是基本代數恆等式之一。
在 {a} 上的語言 a* 是 { ε, a, aa, aaa, ... },它是無限的,但 a* 仍是正規表示式,而 a* 仍是正規語言。注意 ε 永遠被包含在內,因為允許零個複本。
星號把一個符號變成一個無限卻仍正規的語言。
加星後的語言永遠包含 ε,因為允許零次重複。若你想要一次或多次而非零次或多次,請用加號運算子 R+(它是 RR* 的簡寫)。
又稱
另見