2009-09-07 94 views
1

我希望這會有一個非常快速和簡單的答案。我使用regular-expressions.info來幫助我獲得正確的正則表達式,以將URL編碼的ISO-8859-1英鎊符號(「%A3」)轉換爲URL編碼的UTF-8英鎊符號(「%C2%A3」) 。Javascript正則表達式Lookbehind Failing

換句話說,我只想將%A3換成%C2%A3,當%A3尚未加上%C2前綴時。

所以我還以爲下面將工作:

Regular Expression: (?!(\%C2))\%A3 
Replace With:  %C2%A3 

但事實並非如此,我想不通爲什麼!

我認爲我的語法有點不對,但我弄不明白!有任何想法嗎?

僅供參考 - 我知道以下內容會起作用(並且在此期間用它作爲解決方法),但真的很想理解爲什麼前者不起作用。

Regular Expression: ([^\%C2])\%A3 
Replace With:  $1%C2%A3 

TIA!

+0

我認爲你需要一個編碼轉換器將ISO 8859-1轉換爲UTF-8。 – Gumbo 2009-09-07 16:56:09

回答

4

爲什麼不把((%C2)?%A3)替換成%C2%A3,使前綴成爲匹配的可選部分?這意味着即使它已經是正確的,你也可以用自己「替換」文本,但是我沒有預見到性能問題。

+0

聽起來不錯 - 不知道爲什麼我沒有想到 - 謝謝! :)不接受它作爲答案,因爲它本質上是另一種解決方法(問題的關鍵是要找出爲什麼我的後視不工作),但謝謝! – FrostbiteXIII 2009-09-08 09:14:27

+0

忽略 - 接受的答案 - 非常感謝! :) – FrostbiteXIII 2009-09-08 09:29:50

+0

非常好,+1。你可以使用'(?:(?:%C2)?%A3)',因爲在這種情況下反向引用並不是真的需要。 – Tomalak 2009-09-08 09:38:50

4

不幸的是,(?!)語法是負向預測。就我所知,JavaScript不支持負向後視。

你可以做的是繼續進行替換,並以%C2%C2%A3字符串結束,但這些可以很容易地在第二次轉換爲期望的%C2%A3。

+0

我已經問了兩次或三次在ECMAScript,mozilla.dev.tech.js-engine新聞組中添加了後視操作符,並且沒有回覆。隨意添加您的聲音。 http://groups.google.com/group/mozilla.dev.tech.js-engine/browse_thread/thread/5d8e24ca46aa72f1?hl=zh-CN# – 2009-09-07 16:21:36

+0

感謝您的快速回答。聽起來很愚蠢,但我發現很難理解前瞻和後腦之間的主要區別 - 在我看來(我知道我錯了,否則就不會有兩個不同的名字!),它只是做一個搜索一些字符,但不使用這些替換? 並感謝您的建議,但我認爲我的解決方法稍微整潔。 :) – FrostbiteXIII 2009-09-07 16:23:19

+0

這樣想吧....正則表達式通常通過跟蹤您當前在字符串中的位置來工作。這可能是以找出你曾經去過的地方(向後看)和你要去的地方(向前看)爲代價。由於追蹤您當前的位置,因此可能存在實現後視的實施困難。 – 2009-09-07 16:26:21

3

您可以取代

(^.?.?|(?!%C2)...)%A3 

$1%C2%A3 
+0

這在某些情況下似乎太匹配了。嘗試將其與文本「ladskfjdkfj%A3」進行匹配,看起來kfj%A3匹配。 – 2009-09-07 16:29:54

+0

...直到我刪除了省略號,但即使如此,字符串「ladskfjd%C2%A3」也匹配,儘管它不應該... JavaScript並沒有讓這種簡單! – 2009-09-07 16:31:02

+0

@Tomalak:+1這就是我會寫的。 – Gumbo 2009-09-07 16:33:10

1

我會建議你使用the functional form of Javascript String.replace(請參見 「指定函數作爲參數」)。這使您可以將任意邏輯(包括必要時的狀態)放入正則表達式匹配會話中。對於你的情況,我會使用一個更簡單的正則表達式來匹配你想要的超集,然後在函數調用中你可以測試它是否符合你的準確條件,如果不符合,那麼只是按照原樣返回匹配的字符串。

這種方法唯一的問題是如果你有重疊的潛在匹配,你有可能錯過第二個匹配,因爲沒有辦法返回一個值來告訴replace()方法,它不是真的畢竟是一場比賽。