[英]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.