我有一段文字,如下所示。我需要對它做一個基本的編輯,但無法瞭解我需要的正則表達式。也許這只是漫長的一天,我沒有看到我需要的東西。如何在兩個已知令牌之間進行最小匹配?
的樣本數據:
START ITEM = 1235
BEGIN
WORD
RATE = 98
MORE WORDS
CODE = XX
STUFF
END
BEGIN
TEXT
MORE WORDS
RATE = 57
ADDITIONAL TEXT
CODE = YY
OTHER THINGS
END
STOP
START ITEM = 9983
BEGIN
WORD
RATE = 01
MORE WORDS
CODE = AA
STUFF
END
BEGIN
TEXT
MORE WORDS
RATE = 99
ADDITIONAL TEXT
CODE = XX
OTHER THINGS
END
STOP
我給予CODE
和ITEM
號碼,需要在適當的BEGIN
/END
部分編輯的速度。幸運的是,這些部分的定義很明確:STOP
/START
BEGIN
/END
(它們是關鍵字,而不是其他地方)。
我這個工具箱是Perl的正則表達式*
第一個解決方案,我試過沒有工作(值硬編碼):
$tx =~ s/(START \s ITEM \s = \s 9983.*?
BEGIN
.*?
RATE \s = \s)\d+
(.*? # Goes too far
CODE \s = \s XX)
/$1$newRate$2
/sx;
因爲指定的代碼捲起匹配太多,找到更正確的代碼,但始終編輯第一個條目。
對此提出建議?
*
實際代碼依賴於被添加到正則表達式的堆疊(排序的後處理過濾器的),其各自依次施加到文本做編輯的正則表達式。哎呀,如果我有文本,我可以做一個完整的解析器。但我希望不必打開這些代碼,並堅持使用我的API。
實際上,'。*?'完全按照它應該達到的程度 - 問題在於它開始得太早。但JS Bangs的(修正)解決方案就是解決這個問題的方法。 – 2009-09-02 02:34:27