2012-12-10 48 views
0

我正在使用Java來解析JavaScript文件。由於範圍是不同的,在裏面我是用它的環境比預期的,我想用Java正則表達式:在字符後捕獲部分但不替換字符

window.test = value 

此前更換的即

test = value 

每次,我剛剛被使用

writer.append(js.getSource().replaceAll("test", "window.test")); 

這顯然是不通用的,但對於固定的數據集,它工作正常。

但是,我應該一起工作,舊的更新版本的新文件,我現在要處理

window['test'] = value

([[test]])

在這兩種情況下,我都不想匹配test,而且看起來只有這兩種情況纔有新格式。所以我的計劃是現在做一個正則表達式來匹配任何東西,除了'[作爲第一個字符。那將是([^'\[])test;然而,我實際上並不想替換第一個角色 - 只要確保它不是我不想匹配的兩個角色之一。

對我來說這是一個新的情況,因爲我還沒有用RegExps替換那麼多,只是模式匹配。所以我環顧四周,發現我認爲的解決方案,即所謂的「非捕獲組」。 Oracle網頁上的解釋聽起來像我正在尋找的內容,但是當我將正則表達式重寫爲(?:[^'\\[])test時,它的行爲與我沒有改變任何內容完全相同 - 替換test之前的字符。我環顧了一下StackOverflow,但是我發現讓我更加確信自己在做的事情應該能夠工作。

我在做什麼錯,它沒有按預期工作?我濫用這種模式嗎?

+0

您可以發佈[SSCCE](http://sscce.org/) – vainolo

+0

http://www.regexplanet.com/advanced/java/index。html,以及正則表達式,匹配表達式和結果的例子都是一個例子。 –

+0

你可以參考這個問題http://stackoverflow.com/questions/632204/java-string-replace-using-regular-expressions – Smit

回答

3

如果在正則表達式中包含該字符的表達式,它將成爲匹配項的一部分。

訣竅是使用您在替換字符串中匹配的內容,因此您自己替換該位。

嘗試:

replaceAll("([^'\[])test", "$1window.test")); 

在替換字符串中的$ 1是一個反向引用什麼捕獲匹配組1。在這種情況下,這是前面測試的字符

+0

謝謝你,工作。 –

0

爲什麼不簡單測試"(test)(\s*)=(\s*)([\w\d]+)"?這樣,您只能匹配"test",然後是空格,然後是'='後跟一個值(在這種情況下由數字和字母以及下劃線字符組成)。然後,您可以使用組(括號之間)將值(甚至是空白)(如果需要)複製到新文本中。

+0

我給出的例子並不全面 - 也有一些地方,即test.n = 5或x = test.a.b.c.d.substring(4,2);.在那種情況下,我希望它變成window.test.abcd .. –

+0

好的,那很好,我只是想提一下,它有時更容易匹配你實際想要匹配的東西 - 相反的正則表達式或多或少。 –