簡體   English   中英

.NET的正則表達式圖靈是否完整?

[英]Are .NET's regular expressions Turing complete?

正則表達式通常被指向不完全轉換的語言的經典示例。 例如,“正則表達式”作為這個SO問題的答案給出, 尋找不是圖靈完整的語言

在我的,或許有點基本的,理解轉向完整性的概念,這意味着不能使用正則表達式檢查“平衡”的模式。 平衡意義具有與結束字符相同數量的開頭字符。 這是因為要做到這一點需要你有某種狀態,以允許你匹配開始和結束字符。

然而,正則表達式的.NET實現引入了平衡組的概念。 此構造旨在讓您回溯並查看先前的組是否匹配。 這意味着.NET正則表達式:

^(?<p>a)*(?<-p>b)*(?(p)(?!))$

可以匹配以下模式:

ab
aabb
aaabbb
aaaabbbb
... etc. ...

這是否意味着.NET的正則表達式是圖靈完成的? 或者還有其他缺少的東西,這些語言需要圖靈完成嗎?

在計算理論中,正則表達式描述了常規語言。 常規語言類恰好是那些可被某些有限狀態機識別或由常規語法生成的語言。 但是,您描述的示例(平衡短語)不是常規語言,無法通過有限狀態機識別或通過常規語法生成。 實際上,這是一個所謂的無上下文語言的教科書示例。 這些需要用於識別的下推自動機。 無上下文語言類是常規語言的超集,但是是完整語言的適當子集。 大多數編程語言的語法(與語義相對)是無上下文的語言。 如果您有興趣了解有關此主題的更多信息,可以從Chomsky層次結構開始

你幾乎想念turing complete的定義。

以阿蘭圖靈命名的圖靈完整性非常重要,因為迄今為止先進的計算設備的每一個合理的設計都可以通過一個通用的圖靈機來模仿 - 這一觀察被稱為Church-Turing論文。 因此,可以充當通用圖靈機的機器原則上可以執行任何其他可編程計算機能夠進行的任何計算。 然而,這與為機器編寫程序所需的努力,機器執行計算所花費的時間或機器可能具有的與計算無關的任何能力無關。

現在,你不能在正則表達式中做某些事情,所以langauge並不完整。

你知道,你必須像其他人一樣使用相同的定義。 有限的理解應該觸發找出真相。

.NET中的正則表達式並不完整,因為它們總是停止運行。 這不能說是一般的圖靈機。

@Inuyasha:其實你可以用正則表達式做加法。 好吧至少檢查計算是否正確完成。 唯一的事情是你必須以一種奇怪的順序給正則表達式輸入(你不能用正則表達式反轉一個字符串(或檢查它是否被反轉))。

模式是:

abc
def
---
ghi

=> cfi beh adg

假設您要以二進制形式添加1011 0110:

01011
00110
-----
10001


=> 101 110 010 100 001

如果您按照租約有效位的順序將此輸入設置為最大值,散布第一個操作數,第二個操作數和輸出,則會得到字符串101110010100001。這可以通過以下方式匹配:

((000|011|101)|(110(010|100|111)*001))*

這是一個花園品種正則表達。 您可以將此擴展為十進制加法,但正則表達式會變得瘋狂復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM