2011-11-04 48 views
2

兩個分隔符之間的替換項目我想更換拼音之間的音標斜槓是這樣的:如何的TextWrangler

/anycharacter*ou*anycharacter/ 

/anycharacter*au*anycharacter/ 

我的意思是我要替換「OU 「在所有情況下,通過任意兩個拼音斜線之間的」au「。例如:

<font size=+2 color=#E66C2C> jocose /dʒə'kous/</font> 
    = suj vour ver/suwj dduaf 

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font> 
    = suj vour ver/suwj dduaf 
  • 該文本文件包含HTML代碼和一些文本正斜槓(如A/B代替A或B)
  • 字符串 「anycharacter」可以是任何字符,一個或多個字符或沒有字符。例如:/ folou /,/ houl /,/ SOU /,/dʒə'kousnis/ ...

到目前爲止,我一直在使用:

Find: \/(.*?)\bou*\b(.*?)\/\s 
Replace: /\1au\2\3\4/ 

但它找到的所有字符串在任何/.../之間,包括正常的正斜槓和HTLM斜槓,以及在替換它時繞過諸如/ gou /,/ tou /等的項目。正如上面的例子中,輸出是:

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font> 
    = suj vaur ver/suwj dduaf 

注意:正常斜槓「vour」是由「vaur」替換不是我的目的。

請問指導我如何解決上述問題?非常感謝。

回答

7

最簡單的匹配表達式可能滿足您的需求(POSIX ERE標準)爲:

(/[^ \t/<>]*?)ou([^ \t/<>]*?/) 

分解,這意味着:

(   # Capture the following into back-reference #1 
/   # match a literal '/' 
    [^ \t<>] # match any character that is not a space, tab, slash, or angle bracket... 
    *?  #  ...any number of times (even zero times), being reluctant 
)    # end capture 
ou   # match the letters 'ou' 
(   # Capture the following into back-reference #2 
    [^ \t/<>] # match any character that is not a space, tab, slash, or angle bracket... 
    *?  #  ...any number of times (even zero times), being reluctant 
/   # match a literal '/' 
)    # end capture 

然後用替換表達式\1au\2

如果有空格,製表符,尖括號(<和),這將忽略/個字符之間的文本)或其他正斜槓(/)。如果有,你知道這些表情的人會不會出現其他字符,將其添加到字符類(在[]組)

在我的仿真器,事實證明這樣的文字:

<font size=+2 color=#E66C2C> jocose /dʒə'kous/</font> 
    = suj vour ver/suwj dduaf. 
Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur 

...到這個文本:

<font size=+2 color=#E66C2C> jocose /dʒə'kaus/</font> 
    = suj vour ver/suwj dduaf. 
Either A/B or B/C might happen, but <b>at any time</b> C/D might also occur 

只要問是否有什麼,你不明白!如果你願意,我還可以解釋一下你之前嘗試使用的一些問題。

編輯:

上述表達式整個音標集的匹配,並且完全替換它,使用匹配的某些部分和更換等。比賽的下一次嘗試將在當前比賽之後開始。

因此,如果ou/定界語音表達式中可能出現超過一次,則需要多次運行上述正則表達式。對於一次執行,語言或工具需要同時支持可變長度先行和後退(集體環視)

據我所知,這只是微軟的.Net Regex和正則表達式的JGSoft「風味」(在EditPad Pro和RegexBuddy等工具中)。 POSIX(UNIX grep要求)不支持任何類型的環視和Python(我使用它)不支持可變長度環視。我相信如果沒有可變長度的環視,這是不可能的。

需要可變長度環視,並做了你需要的可能是像這樣的表達式:

(?<=/[^ \t/<>]*?)ou(?=[^ \t/<>]*?/) 

...和替換式將需要以及修改,因爲你是匹配(從而取代),僅是要被替換的字符:

au 

它的工作原理非常不同的是它只有ou匹配相同的,然後運行檢查(稱爲零寬度斷言),以確保它立即在/之前和任意數量的特定字符,緊接着是任意數量的特定字符,然後是/

+0

你是第一!它像一個魅力。非常感謝你!然而,還有一件小事:一次發現並替換一個實例。例如:/,foulinizou /需要兩次更換 - 第一次,它返回/,faulinizou /。當我再次運行表達式時,它返回/,faulinizau /。這不是一個大問題,因爲我很高興能夠多次運行表達式,只要它解決了我的問題。它能解決我的問題!非常感謝你! –

+0

由於在某些語言和正則表達式實現中缺乏對「功能」的支持,我添加了另一種可能性,我擔心在您的情況下無法工作 –

+0

非常感謝您的更新。我認爲TextWrangler不支持**可變長度**,因爲它在更新的表達式運行時會產生搜索錯誤。錯誤說:「Grep模式:lookbehind斷言不是固定長度」。 –

相關問題