2013-08-22 61 views
1

我試圖找出爲什麼RegExMatch命令在下面的代碼中失敗時,我從一個文件讀取變量時使用它。當我將文件內容直接分配給AHK中的變量時,它可以工作。爲什麼AutoHotkey RegExMatch在文本文件上使用時失敗,但是使用變量?

要進行測試,打開記事本,TableCode2的多內容複製到記事本並保存爲C:\ TEMP \ testtable.txt

當我運行該腳本,第一個消息框不顯示匹配。 第二個框匹配。我在windows7 32bit和64bit上測試了這個。

任何想法兩種方案之間的區別是什麼和爲什麼我不能匹配 對文件?

InputTable = c:\temp\testtable.txt 
FileRead, TableCode, %InputTable% 

TableCode2 = 
(
OBJECT Table 50093 test 
{ 
    OBJECT-PROPERTIES 
    { 
    Date=22.08.13; 
    Time=10:47:20; 
    } 
    PROPERTIES 
    { 
    } 
    FIELDS 
    { 
    { 1 ; ;test    ;Text30   } 
    } 
    KEYS 
    { 
    { ;test         ;Clustered=Yes } 
    } 
    CODE 
    { 

    BEGIN 
    END. 
    } 
} 
) 

Needle := "FIELDS(.*)KEYS" 
Foundpos := RegExMatch(TableCode,Needle,Out) 
msgbox, %Needle%`n %Out1%`n--------------%TableCode% 

Foundpos := RegExMatch(TableCode2,Needle,Out) 
msgbox, %Needle%`n %Out1%`n--------------%TableCode% 
+0

你能告訴我們'TableCode'文件的外觀嗎? –

+0

@Sniffer:見上文。請在代碼中標記TableCode2的內容。這些是圓括號內的行。第一行以「OBJECT」開始,最後一行是「}」。打開Windows記事本並將這些行粘貼到新文檔中。保存爲testtable.txt – 576i

回答

2

在AHK正則表達式匹配「任何單個字符這不是一個新行(`r`n)序列的一部分」。 這就是棘手的部分:默認情況下,Windows文本文件的換行符是`r`n,而代碼中的括號符號由`n'字符作爲換行符。
因此,RegExMatch("FIELDS(.*)KEYS")默認會在遇到`r`n時停止使用。在你關於該文件的例子中,這是在FIELDS之後立即禁止正則表達式變成真的。
另一方面,變量TableCode2不包含單個字符,允許正則表達式達到KEYS
有很多可能的解決方案,例如從文件中剝離每個`r,但最簡單和最一致的方法是使用簡單的DotAll選項。 「這會導致句點(。)匹配包括換行符在內的所有字符(通常與換行符不匹配)。
生成的正則表達式可能如下所示:s)FIELDS(.*)KEYS

但是,不應使用正則表達式來解析不是常規語言的東西。如果您可以控制輸出,請使用XML或JSON等標準格式。如果您正在解析某種編程語言,請使用現有的編譯器/解釋器來解析它,然後將其轉換。

+0

謝謝,這個工程。唉,我沒有控制輸出,但一旦我開始匹配「^ \ s \ sFIELDS(。*)^ \ s \ sKEYS」後,正則表達式解析應該足夠安全,而不是所有的'r。 – 576i

+0

@ 576i輸入來自哪裏,這是什麼類型的符號?另外,我儘可能使用'(。*?)',使正則表達式不貪婪。這可以避免另一個'KEYS'混淆輸出。 – MCL

+1

不錯,你解釋它是如何工作的,MCL。你是個好人。 – bgmCoder

相關問題