2011-03-09 21 views
21

我需要在執行替換操作時向反向引用添加一個數字。正則表達式中的數學運算

例如,我重寫URL

www.site.com/doc.asp?doc=321 &語言= 1

www.site.com/headline/100321.article

例如做一個簡單的替換,但我需要添加100,000文檔ID。我在下面的工作至今沒有添加任何東西。

s/.*doc=(\d+).*/www.site.com\/headline\/$1.article/g; 

但是我怎樣才能增加100,000到$ 1?

注意,在號碼前你不能僅僅加上「100」,因爲文件編號可能是> 999

+2

我設法做一個簡單的數學表達式使用'e'標誌。 s /.* doc =(\ d +)。*/$ 1 + 100000/e但這樣它只返回數字而不是'包裝'網址。我需要將其與字符串的其餘部分連接起來。 – Kevin 2011-03-09 11:26:02

+0

+1感謝這個問題。幫助我在Linux程序'rename'上做類似的事情。 – Geoff 2011-11-29 16:05:35

回答

29

使用Perl:

s/.*doc=(\d+).*/"www.site.com\/headline\/".($1+100000).".article"/e; 

因爲你已經隨e標誌位來完成,右邊的部分現在成爲一個表達式。所以你必須將非捕捉部分包裝爲字符串。

+0

做你碰巧知道這是否在.Net正則表達式分析器中工作? – Kevin 2011-03-09 12:10:46

+1

@凱文,不,不。 '($ 1 + 100000)'部分由Perl評估,正則表達式與此無關。但是,看起來你已經在使用Perl了,不是嗎? – 2011-03-09 12:11:51

+2

不錯的Perl巫術!+1 – 2011-03-09 12:12:49

5

這是不可能的正則表達式。正則表達式只匹配模式,它不會算術。

你能做的最好的事情是一樣冗長:

match  replace 

(\d{6,}) $1 
(\d{5})  1$1 
(\d{4})  10$1 
(\d{3})  100$1 
(\d{2})  1000$1 
(\d)  10000$1 
+0

是否有可能創建一個可以做算術運算的正則表達式?像一個非常複雜的?我知道這樣做並不是最有效的方式,但作爲技術練習,它仍然有價值。實際上,我是如何找到這個網頁的(通過相關的Google搜索):因爲我很好奇這是否可能,或者是否有人做過。 – flarn2006 2016-08-29 21:00:46

+0

@ flarn2006,不,就像我說的,正則表達式只匹配模式,它不會算術。正則表達式只會告訴你「是的,文本匹配你提供的模式(或不,它沒有)」,沒有別的。 – 2016-08-30 21:05:42

+0

如何使正則表達式匹配一個正確的算術語句?就像「45 + 6 = 51」一樣,但是「38 + 16 = 4」不會。這在理論上是可能的嗎? – flarn2006 2016-08-31 15:13:31

2

如果只有你可以只蠻力在正則表達式它

...doc=322 -> www.site.com/headline/100322.article 
...doc=323 -> www.site.com/headline/100323.article 
...doc=324 -> www.site.com/headline/100324.article 
...etc 

數學幾篇文章,你在這裏第一次看到它。