2011-12-13 86 views
-3

我試圖在沒有or運算符的情況下重寫這段代碼。重寫Perl正則表達式

if((/^\s*field\s+{\s*$/)||(/^\s*field\s+{\s*\/\/.*$/) 
    { 
     # Do something 
    } 
+0

爲什麼限制?(這是否是作業?) –

+7

您尚未在此提供足夠的信息。你想匹配什麼標準? '/./'的正則表達式可以匹配所有那些沒有'|'的行。運營商。 – Flimzy

+0

不是作業:)我正在寫解析器,我想匹配註釋行。 -2爲此?! – Jean

回答

0

如果你想重寫

(/^\s*field\s+{\s*$/) || (/^\s*field\s+{\s*\/\/.*$/) 

我可以建議:

m#^\s*field\s+{\s*($|//)# 

最後一部分($|//)會尋找任何兩個有效行結尾的:行剛剛結束,或兩個斜線。請注意,斜線後面可以跟任何字符,就像你寫了//.*$一樣。

+0

此文件中不會有任何分割運算符。 – Jean

+0

那麼..這段代碼會做*某事*,但我懷疑你可以做一切事情,除非你使用更具體的工具,就像paxdiablo在他最近的修訂版中所建議的那樣。 – TLP

+0

只給了一個原始問題的編輯。我想我正在描述一個XY問題。 – Jean

2

您的規則不是很嚴格規定,但你可以捕捉到一個簡單的那些行:

^text[1-3] 

這將讓所有的行開始與那些textN話,其中N是一組{1,2,3}之一。這似乎是最有可能的基礎上,實際上它是用正則表達式|功能實現還有:

^(text1|text2|text3) 

然而,如前所述,規格並不是那麼詳細,所以我們真的不知道你想要什麼捕捉。您應該指定您需要捕獲的準確的規則,而不僅僅是可能被誤解的示例。


好了,你的意見之一後,它開始變得有意義:

我解析一個類似於C++的文件,我希望我的解析器同時匹配評論和註釋的行(單行註釋)。

因此,您正在尋找有效的行結束行註釋//或行根本沒有評論。

評論中的關鍵詞是「parse」。嚴重的是,不要試圖用正則表達式來做到這一點,除非你知道代碼會非常簡單。如果你想解析,你需要一個解析器。乾淨利落。事實上,即使對於簡單的代碼,我建議你應該使用解析器。

例子:你會用下列完全有效行做:

int ratio = height 
       /
        width; 
char *description = "This program will look for '//' markers"; 
int myvar = text1/comment; 

假設你的C++ - 語言一樣會非常簡單的(例如,比其他任何//字符在一行的結尾處註釋),您可以在早期階段將每條線的末尾剝去//.$,以便在稍後的過程中不會看到註釋。

然而,這是對你的語法/語法相當嚴格的限制,除非你能強加,詞法分析器/分析器是最好的方式。

+0

說文件具有C++樣式行註釋會更合適。除了評論以外,不會有任何流浪/角色。 – Jean

+0

@alertjean,你仍然可能需要一個解析器,以便在例子中處理像'char * description'這樣的東西。我將用簡單的方式用正則表達式處理您的需求來更新答案。 – paxdiablo