我正在更新修复字幕的程序。
直到现在我没有使用正则表达式就离开了,但是最后出现的问题可能会受益于它们的使用。 (我已经在没有正则表达式的情况下解决了它,但它是一种非常不优化的方法,会大大减慢我的程序。)
TL; DR;
我正在尝试做以下工作:
我想要所有的实例:
"! ."
,"!."
和"! . "
成为:"!"
除非点后面跟着另一个点,在这种情况下我想要所有的实例:
"!.."
,"! .."
,"! . . "
和"!. ."
成为:"!..."
我试过这段代码:
the_str = Regex.Replace(the_str, "\\! \\. [^.]", "\\! [^.]");
接近我想要做的第一部分,但我不能使替换字符串的[^.]
字符与原始字符串中的字符相同...请帮助!
我对C#和PHP实现感兴趣......
答案 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#的逐字字符串文字 - 反斜视的解毒剂。 ;)