簡體   English   中英

復雜的問題。 需要幫助進行正則表達式替換

[英]Complicated problem. Need help with regular expression replace

我正在更新一個可修復字幕的程序。

到現在為止,我還沒有使用正則表達式,但是最后出現的問題可能會受益於它們的使用。 (我已經解決了不帶正則表達式的問題,但這是一種未經優化的方法,大大降低了我的程序的速度)。

TL; DR;

我正在嘗試進行以下工作:

我想要以下所有實例:
"! ." "!." "! . "變成: "!"

除非該點后面有另一個點,否則在這種情況下,我需要以下所有實例:
"!.." "! .." "! . . ""!. ." 變成: "!..."

我已經試過這段代碼:

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

接近我想做的第一部分,但是我無法使替換字符串的[^.]字符與原始字符串中的字符相同...請幫助!

我對C#和PHP實現都感興趣...

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

這在PCRE中起作用。 您可能可以做一些魔術,將其合並為一個魔術,但現在不再可讀。 第一個PCRE用於!... ,第二個用於! 它們非常簡單。

C#

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

的PHP

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

第一個點被消耗但未被捕獲; 您實際上是將那一個扔掉了。 組#1捕獲第二個點(如果有一個),否則捕獲一個空字符串。 在任何一種情況下,將其插入替換字符串三遍即可獲得所需結果。

我使用\\s而不是文字空間來使我的工作更明顯,並添加了? 量詞以使空格為可選。 如果確實需要將其限制為實際的空格字符(而不是制表符,換行符等),則可以將其改回空格。 如果您想一次允許一個以上的空間,可以更改? *在適當的地方-例如:

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

另外,請注意使用C#的逐字字符串文字-反斜杠炎的解毒劑。 ;)

暫無
暫無

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

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