如何替換特定單字之間的特定字元?

如何替換特定單字之間的特定字元?

您能否幫助我了解如何使用 Notepad++ 尋找/取代功能來取代特定單字之間的特定字元。請參閱下面的範例,我想找到單字“START”和“END”之間的所有連字符,並將其替換為空格。文件中的所有其他連字符不會被替換。

我一直在嘗試使用我在谷歌上搜尋的正規表示式範例來解決這個問題,但不幸的是到目前為止我還沒有成功。

這是我所擁有的:

START-Hyphens-should-be-replaced-here-01-END
OTHER-no-changes-here-02-WORD
START-Hyphens-should-also-be-replaced-here-03-END
OTHER-no-changes-here-either-04-TEXT

這是我想要的:

START Hyphens should be replaced here 01 END
OTHER-no-changes-here-02-WORD
START Hyphens should also be replaced here 03 END
OTHER-no-changes-here-either-04-TEXT

答案1

我建議您完全放棄正規表示式 - 在這種情況下讓它工作實在太麻煩了。並不是所有事情都可以用正規表示式輕鬆解決!在這種情況下,大多數腳本語言都可以相當輕鬆地做到這一點。我已經為你寫了一段 JavaScript,這裡- 只需輸入分隔符號並輸入,然後按一下「提交」。

至於解釋:它按開始分隔符號分割,然後對於每個“區塊”,它按結束分隔符號分割。我們最終得到位於開始和結束之間的一段文本,並對其進行替換。然後我們將分裂的塊重新連接在一起。這不是最有效的方法,但它比處理單一字元要容易一些。

xkcd - Perl 問題


下面是舊的、部分工作的正規表示式解決方案。我重重地建議您不要使用它。

快速回答:不要使用 Notepad++,使用JS 片段(在右下角輸入文本,然後按一下「提交」)。根據需要替換腳本左下角的START和。END

或者,您可以使用 Windows (Vista+) 隨附的 PowerShell:

Get-Content input.txt | %{ $_ -replace "(?<=START.*?)-(?=.*?END)", " " } | Out-File output.txt

input.txt並相應地進行替換output.txt。注意:它們必須是不同的文件。

這個特殊的解決方案只有在你只有START每行出現的次數 END每行出現的次數它們不跨越線 - 所以我們可以獨立處理每條線。


保證每行只需要一個匹配項,並且每個匹配項都包含在一行中,匹配(?<=START.*?)-(?=.*?END)並替換為單個空格是可行的 -除了Notepad++ 似乎不喜歡這種特殊的模式。它支援lookbehinds和lookaheads(顯然是完整的PCRE),但有一些東西讓它出錯。

另一種替代方案與 Johannes 已經回答的類似,是使用一個簡單的模式:(START.*?)-(.*?END)並將其替換為\1 \2。這裡的問題是這只會匹配一次每行一個連字符。這很快就會變得乏味。

在這裡,我們嘗試使用更完整的腳本語言。 JavaScript 是不錯的選擇。然而,它支持後視。從好的方面來說,我們可以循環運行,因此之前繁瑣的解決方案實際上是可行的。我創建了一個例子這裡

答案2

合適的正規表示式是(START[^\-]*)-(.*END),將其替換為\1 \2並多次使用“全部替換”(每次點擊每行僅替換一個)。

相關內容