2011-07-29 28 views
2

我一直在努力尋找一種方法來替換字符串中的破折號空格,但只能在字符串的特定部分內使用空格。使用正則表達式替換子字符串中帶有破折號的空格。

來源:

ABC *This is a sub string* DEF 

我嘗試在正則表達式

/\s/g 

如果我使用正則表達式匹配的空間和替換我得到以下結果:

ABC-*This-is-a-sub-string*-DEF 

但我只想替換由兩個星號包圍的文本中的空格。

這裏是我想要實現:

ABC *This-is-a-sub-string* DEF 

不知道爲什麼我使用的,因爲我使用find和TextMate中使用正則表達式替換選項的正則表達式類型啓用。

重要的是要注意,我將運行此正則表達式搜索和替換的字符串將具有不同的文本,但它只是我想要匹配的星號內的空格。

任何幫助將不勝感激。

+0

你使用什麼語言/程序? – kevlar1818

+0

TextMate搜索和替換。 – Camsoft

回答

2

要識別周圍有星號的空間,關鍵的觀察是,如果星號只出現在成對的位置,那麼您尋找的空格後面總是跟着一個奇數個星號。

正則表達式

\ (?=[^*]*\*([^*]*\*[^*]*\*)*[^*]*$) 

將匹配應更換一次。 Textmate將不得不支持預見性聲明才能發揮作用。

+0

感謝您指出其他答案錯誤。我測試了你的,它確實有效。 – Camsoft

+0

確實很聰明:)但如果您在文檔中有星號的奇數,它將無法正常工作。但無論如何,這是沒有道理的:) +1 – petho

0

試試這個:\s(\*[^*]*\*)\s。它將在組1中匹配*This is a sub string*。然後替換爲-$1-

1

試試這個

/(?<=\*.*)\s(?=.*\*)/g 

但如果你想在它使用它,它不會在JavaScript的工作,因爲它使用還回顧後未在JS

+0

我沒有想到這一點,但它給出了這個錯誤(至少在PHP中):編譯失敗:lookbehind斷言不是固定長度 – nobody

+0

interresting,我沒有嘗試在PHP中。正則表達式可能有一定的侷限性。當然,這取決於使用哪種正則表達式解釋器。就像我說的,例如JS根本不支持向後看。我沒有/使用Textmate,所以不知道它是否以及如何支持它:) – petho

+0

如果字符串中有兩個標記的子字符串,例如:ABC *這是一個子字符串* DEF *這是另一個子字符串在DEF周圍的字符串*空格也會被轉換。 – nobody

0

使用這個正則表達式來支持從星號內部獲得空格 (.)(*(.(\).)*)(.) 獲取由正則表達式{4}提供的數組的第4個元素並將其替換爲破折號。

I find this site very good用於創建正則表達式。

2
s/(?<!\*)\s(?!\*)(?!$)/-/g 

如果TextMate支持Perl風格的正則表達式命令(我沒有這方面的經驗,對不起),這是一個應該工作的單線程。

+0

哇,那工作。非常感謝! – Camsoft

+0

@Camsoft:這個正則表達式並不能代替星號之間的空格,但是隻有空格沒有跟着/前面有星號。它不適用於'ABC DEF * substring here * GHJ IKL' – Jens

+0

對不起,說得太快。 – Camsoft

相關問題