簡體   English   中英

Java RegExp:捕獲字符后的部分,但不要替換字符

[英]Java RegExp: Capture part after a character but don't replace the character

我正在使用Java來解析JavaScript文件。 由於作用域與我在其中使用的環境不同,因此我嘗試替換ie的每個實例

test = value

window.test = value

以前,我一直在使用

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

這顯然不能推廣,但對於固定數據集而言,它可以正常工作。

但是,在我應該使用的新文件中,舊文件的更新版本中,我現在必須處理

window['test'] = value

([[test]])

在這兩種情況下,我都不想匹配test ,並且似乎只有這兩種情況存在新格式。 所以我的計划是現在做一個正則表達式以匹配'[作為第一個字符。 那將是([^'\\[])test ; 但是,我實際上並不想替換第一個字符-請確保它不是我不想匹配的兩個字符之一。

這對我來說是一個新情況,因為我沒有花太多時間來用RegExps進行替換,而只是進行模式匹配。 因此,我環顧四周,發現我認為是解決方案的方法,稱為“非捕獲組”。 Oracle頁面上的解釋聽起來像我在尋找什么,但是當我將正則表達式重新編寫為(?:[^'\\\\[])test ,它的行為與我沒有做過的行為完全相同改變了一切-替換test前的字符。 我環顧了StackOverflow,但發現的內容使我更加確信自己所做的應該可行。

我無法按預期工作,這是什么意思? 我在濫用圖案嗎?

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

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

嘗試:

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

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

為什么不簡單地對"(test)(\\s*)=(\\s*)([\\w\\d]+)" 這樣,您只匹配"test" ,然后是空格,后跟一個'='符號,后跟一個值(在這種情況下,由數字,字母和下划線組成)。 然后,您可以使用組(在括號之間)將值-甚至將空格(如果需要)復制到新文本中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM