2014-10-20 144 views
2

我想知道是否有可能在正則表達式替換中創建一個條件?正則表達式條件替換

讓我們舉一個簡單的例子:

  • <filename>.orig應改變<filename>.dest
  • _<filename>.orig應該default.dest

改變使用這個表達式,我如果2組捕捉<filename>它的前綴是下劃線,否則在組3中:

01現在

,我想這會是這樣的替換使用條件語句(/(?(if)then|else)/):

/^(_)?((?(1)[a-z-]+|))((?(1)|[a-z-]+))?\.orig$/(?($2)default|$3)\.dest/i 

顯然,不幸的是,這是行不通的:

+-------------+-----------------------+--------------+ +----+-----+-----+ 
| Input  | Output    | Expected  | | $1 | $2 | $3 | 
+-------------+-----------------------+--------------+ +----+-----+-----+ 
| foo.origin | (?()default|foo).dest | foo.dest  | | |  | foo | 
| bar.origin | (?()default|bar).dest | bar.dest  | | |  | bar | 
| _baz.origin | (?(baz)default|).dest | default.dest | | _ | baz |  | 
+-------------+-----------------------+--------------+ +----+-----+-----+ 

有沒有人知道一種方法來實現我的目標?

+0

它基於您正在運行的語言。我認爲這將是可能的在Perl中。 – 2014-10-20 15:16:05

+1

你在做什麼語言?這將有助於將其分解。此外,只是一個參考,條件是沒有必要這樣做,實際上它似乎太多了。 – hwnd 2014-10-20 15:18:10

+0

我同意@AvinashRaj。據我所知,在Python中是不可能的。你將不得不分別調用每個正則表達式的替換方法。 – skrrgwasme 2014-10-20 15:18:12

回答

0

,你可以在大多數語言做的是:

^(?:([^_]\S*)|_\S+)\.orig$ 

和檢查捕獲組,如果它是空的,請更換default.dest,否則有\1.dest取代。檢查捕獲組部分發生在一種語言中,但您可以看到類似的東西已經here

+0

當然,我可以檢查捕獲組。這很容易,如果可能的話,我顯然會選擇這種方式。不幸的是,在這個特定的上下文中(ST3 Builds),我只能使用一個正則表達式來獲得我的結果,僅此而已。 – zessx 2014-10-22 06:06:42

+0

Afaik沒有條件替換之類的東西,就像有條件匹配一樣。這是因爲正則表達式主要是一個匹配工具。注意_tool_那裏,請原諒我的意見,但我強烈地感到人們需要了解正則表達式是一種工具,而不是一種解決方案。允許您只指定1(或2)個正則表達式來完成特定任務的所有工作的框架顯然不理解這個重要的區別。你沒有參與我崇尚的崇高文本設計選擇;)只是在這裏傳播福音。 – funkwurm 2014-10-23 09:00:09