复杂的问题。需要帮助正则表达式替换

时间:2010-09-27 16:54:42

标签: c# php regex string

我正在更新修复字幕的程序。

直到现在我没有使用正则表达式就离开了,但是最后出现的问题可能会受益于它们的使用。 (我已经在没有正则表达式的情况下解决了它,但它是一种非常不优化的方法,会大大减慢我的程序。)

TL; DR;

我正在尝试做以下工作:

我想要所有的实例:
"! .""!.""! . "成为:"!"

除非点后面跟着另一个点,在这种情况下我想要所有的实例:
"!..""! ..""! . . ""!. ."成为:"!..."

我试过这段代码:

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

接近我想要做的第一部分,但我不能使替换字符串的[^.]字符与原始字符串中的字符相同...请帮助!

我对C#和PHP实现感兴趣......

2 个答案:

答案 0 :(得分:1)

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

这可以用于PCRE。你可能可以做一些魔法将它合并到一个,但它不再可读。第一个PCRE用于!...,第二个用于!。它们非常简单。

答案 1 :(得分:0)

<强> 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#的逐字字符串文字 - 反斜视的解毒剂。 ;)