2009-10-18 27 views
3

我很清楚正則表達式是什麼,所以請避免給我定義。我只是在尋找意見,甚至可能會提供一些建議。我很快就獲得了計算機科學學位,就這一點而言,我在正則表達式上獲得的唯一教育是通過PL設計和開發課程。我們從未接受過在實際應用中的使用以及它在我們正在編寫的程序中的使用,只有使用Regex才能真正使用編程語言。正則表達式是匹配和替換文本的最佳方式嗎?

我的問題是,我正確地假設正則表達式是匹配和處理文本中最強大的工具?如果我錯了,還有什麼是我應該教我自己(而不是正則表達式)?另外,有沒有人知道Eclipse IDE的任何好的正則表達式插件(最好是Galileo)。我正在尋找一些能夠讓我測試文檔並突出顯示正在完成的工作。謝謝

回答

4

這實際上取決於什麼是強大的。例如,在複雜性方面,RegEx很難處理遞歸。您需要像JavaCC或YACC這樣的編譯器編譯器(編譯器生成)來處理它。這就是您無法完全從RegEx創建XML解析器的原因。 RegEx的大部分時間足夠老練。

就性能而言,RegEx無法與直接解析相競爭。例如,如果您想查看一個字符串是否以單詞「Prefix」開頭;在RegEx中,您選擇'/^Prefix.*/',但在非RegEx Java中選擇'Str.startsWith("Prefix")'。兩者的速度無與倫比。

但是,在許多情況下,RegEx允許代碼更易於管理。最簡單的例子是,如果你想檢查一個字符串是否以至少10個數字開頭,在Java中,你可能會這樣寫:

for(int i = 0; i < Math.min(10, Str.length); i++) { 
    char C = Str.charAt(i); 
    if ((C < '0') || (C > '0')) 
     reutrn false; 
} 
return true; 

比較正則表達式:

static final String CheckRegEx = "^[0-9]{10,}+"; // So you have it expressed in one place 
static final String CheckPattern = Pattern.compile(CheckRegEx); 

if (CheckPattern.matches(Str)) { 
    // Match 
} 

用正則表達式的代碼更易於管理。

我想說的是,每種技術都有交易,他們必須是平衡的。

對於大多數情況下,RegEx是一個非常好的工具,它被設計來完成任務。

+1

的侷限性帖子中的正則表達式等於char匹配的代碼。我認爲它應該是:/^[0-9]{10,}+.*/ – p3t0r 2009-10-18 19:32:41

+1

一些正則表達式(例如PCRE)在遞歸方面沒有問題。 – eyelidlessness 2009-10-18 19:37:33

+1

感謝p3t0r,我中途改變了主意,忘記了更新。 :-)。我知道PCRE,但它在許多環境中都不可用。 :-) – NawaMan 2009-10-18 19:48:11

7

我會使用正則表達式,當我真正表達模式。有些人喜歡使用正則表達式,當他們試圖做的事情可以很容易地在很少的「原始」字符串操作中實現(indexOfsubstring,contains等)。

我發現它有時候值得實施相同的操作兩次 - 一次使用正則表達式,一次不使用。離開代碼一天,然後回去看看它。想象一下你可能想做出的一些改變 - 哪個實現更容易理解?哪一個更容易改變?有時這將是正則表達式,有時它會是原始字符串操作。

建議你用註釋記錄你的正則表達式。特別是,當你不得不在大廈的正則表達式中看到某些東西時,這是一個很好的文檔候選。 (這裏也有例外 - 我可以永遠記住這反過來$和^去,但很明顯,當你正在尋找一個合作式)

2

此外,沒有任何人知道任何好的正則表達式 插件對於Eclipse IDE(最好是Galileo )。

我喜歡Quickrex plugin for Eclipse - 很容易將它集成到您​​最喜愛的視圖中。

2

正則表達式專門爲在文本中查找字符串而構建。

還有其他方法可以做到這一點,但它們是有限的和語言特定的。

正則表達式是一個非常強大的工具,它也是一種技術/語法,可能會持續很長時間。因此,這是一個非常好的候選人,可以在職業生涯開始時學習。

1

正則表達式是匹配和替換字符串的最佳工具,除非它們不是。在日誌文件或文本語料庫中?真棒。在XML或HTML文檔中?可怕。這實際上取決於您要處理的文本的結構和含義。

2

學習正則表達式後,它們非常強大。如果RE以您選擇的語言提供一流的公民身份,如Perl,Ruby或Python,它將會有所幫助。如果他們深藏在圖書館中,使用起來會很麻煩。

我通常使用原生支持正則表達式的語言編寫程序。我可以輕鬆評估我的時間和運行時間之間的折衷。在運行時使用substr()和index()可能會快幾毫秒。但是,如果它歸結爲在三十秒內剔除正則表達式與五分鐘之間的區別來編程和調試字符串操作函數的組合,那麼我幾乎每次都會爲RE投票。

2

我想大多數正則表達式的優缺點已經被提及。我只想補充一點,它有助於理解在決定將它們應用於特定問題之前如何實現正則表達式。這article可能會有所幫助。

2

正則表達式當然是一種非常強大的文本匹配方式,即正則語言。當然,今天的正則表達式引擎處理遠遠超過常規語言(通過遞歸,代碼插入和其他技巧)。

超越正則表達式的下一步是語法分析器(yacc,bison et al)。如果你有興趣的解析,我會鼓勵你去看看在perl6實施即將到來的語法分析器,它似乎提供了非常強大的正則表達式和基於語法分析的交融,遠遠超越傳統的正則表達式