2010-09-27 39 views
0

我正在更新修復字幕的程序。直到現在,我沒有使用正則表達式就離開了,但最後出現的問題可能會受益於他們的使用。 (我已經解決了它沒有正則表達式,但它是一個非常優化的方法,顯着減慢我的程序)。複雜的問題。需要正則表達式替換幫助

TL; DR;

我想作以下工作:

我想要的所有實例:
"! .""!.""! . "成爲:"!"

,除非點後跟另一個點,其中情況下,我想的所有實例:
"!..""! ..""! . . ""!. ."成爲:"!..."

我試過這段代碼:

the_str = Regex.Replace(the_str, "\\! \\. [^.]", "\\! [^.]"); 

來接近的是我想做的第一部分,但我不能讓替換字符串的字符[^.]是相同的字符作爲一個在原始字符串中...請幫助!

我感興趣的是C#和PHP實現...

回答

1
$str = preg_replace('/!(?:\s*\.){2,3}/', '!...', $str); 
$str = preg_replace('/!\s*\.(?!\s*\.)/', '!', $str); 

這確實到PCREs工作。你可能會做一些魔術來合併它,但它不會再被讀取。第一個PCRE用於!...,第二個用於!。他們很簡單。

+0

是不是你的第二個'preg_replace'會匹配你在第一個做的替換? - 沒關係。我明白爲什麼現在不會。 – BBonifield 2010-09-27 17:07:39

+0

已經修復了;)但是,第一個版本會。 – NikiC 2010-09-27 17:08:57

+0

謝謝,這就像一個魅力! – funkybomber 2010-09-27 17:10:27

0

C#

s = Regex.Replace(s, @"!\s?\.\s?(\.?)\s?", "!$1$1$1"); 

PHP

$s = preg_replace('/!\s?\.\s?(\.?)\s?/', '!$1$1$1', $s); 

第一點被消耗但不捕獲;你有效地扔掉那一個。如果組1中有一個,則組1捕獲第二個點,否則捕獲第二個點。在任何一種情況下,將其插入替換字符串三次即可獲得所需的結果。

我用\s而不是字面空格來使它更加明顯我在做什麼,並添加了?量詞使空格可選。如果你真的需要限制它到實際的空間字符(不是標籤,換行符等),你可以將它們改回空格。如果你想允許在同一時間超過一個空間,你可以改變?*在適當情況下 - 例如爲:

@"!\s*\.\s*(\.?)\s*" 

另外,還要注意使用C#的逐字字符串的 - 解藥的反斜槓。 ;)