2013-02-21 40 views
0

我試圖找出一個正則表達式來代替從「名1」到「N1」,在Ruby中一些字符串包含單詞:正則表達式替換單詞的一些實例,但不是別人

Name1_Instance_1 --> N1_Instance_1 
Name1_Instance_2 --> N1_Instance_2 

但如果字符串包含在最後一個.XML:

Name1.xml 
Name1_Instance.xml 

我已經試過這樣:

Name1[\w_]*[^.xml] 

不過,這並不排除日區分

Name1_Instance.xml

+0

爲什麼它必須是一個正則表達式?顧客要求,還是任意決定? – 2013-02-22 07:15:05

+0

我需要一個智能搜索替換,這不會觸及文件引用,因爲這會一堆的XML文件 – Flethuseo 2013-02-22 15:09:17

+0

這並不是說爲什麼它必須是一個正則表達式雖然搞砸了的東西。他們可能成爲維護噩夢,許多人都迷戀使用它們的原因是錯誤的。他們是強大的,但這可能會帶來成本,所以要小心翼翼地去那裏。 :-) – 2013-02-22 17:25:07

回答

2

嘗試沿着這些路線的東西:

這裏我用了一個前向斷言((?=\d+)),看看是否一個或多個數字跟在名稱後面,然後我使用否定性前瞻斷言((?!\w*\.xml))排除以.xml結尾的任何項目。任何類型的Lookahead斷言都不會消耗任何字符串,並且不會返回結果中的任何部分lookahead斷言。

在Ruby中,你可以這樣做:

t = """Name1_Instance_1  
.. .. .. .. Name1_Instance_2  
.. .. .. .. Name1.xml  
.. .. .. .. Name1_Instance.xml""".gsub /Name(?=\d+)(?!\w*\.xml)/, 'N' 

print t 
N1_Instance_1 
.. .. .. N1_Instance_2 
.. .. .. Name1.xml 
.. .. .. Name1_Instance.xml 
+0

不,它真的是名稱1 – Flethuseo 2013-02-21 19:29:45

+0

這一個工程,但我只是不知道如何做替代部分.. – Flethuseo 2013-02-21 19:52:32

+0

我更新了Ruby的答案。 – 2013-02-21 20:59:36

1

你可以試試這個:

Name1\w*(?!\.xml) 

?!negative lookahead

+1

我用'\ w'替換了'[\ w_]',因爲'\ w'已經包含了下劃線。 – migg 2013-02-21 19:16:52

+0

未來的展望是否需要括號?我不想選擇它。 – Flethuseo 2013-02-21 19:20:21

+0

這是必要的,它不會被選中,因爲它是一個前瞻。 – migg 2013-02-21 19:22:06

1

你可以使用負前瞻,看起來像:

Name1[\w]*(?!\.xml)