0

我有一个带有 Ghost in the Shell 2 字幕的 .srt 文件,我想清除除引文和引文的翻译者参考之外的每一段对话。所以在:

    66
    00:12:50,035 --> 00:12:54,096
    "What's the point of blaming the mirror
    if you don't like what you see."
    [Trans. Note: He's quoting Nikolai Vasilevich Gogol.]

我只想选择:

    "What's the point of blaming the mirror
    if you don't like what you see."
    [Trans. Note: He's quoting Nikolai Vasilevich Gogol.]

到目前为止,我得到了这个:

    ("[\s\S]+?"[[\s\S]+?])

但是这个有一个问题,因为它选择了“foobar”和[foobar]之间的文本片段,如下所示:

    "If our gods and our hopes are nothing but scientific phenomena,
    then it must be said that our love is scientific as well"

    2
    00:01:05,732 --> 00:01:08,098
    Repo-202 calling air traffic control.

    3
    00:01:08,201 --> 00:01:09,725
    We've arrived over the site.
   [The kanji means "Look"]

我只想在他们在一起时选择“引文”[note]。

4

2 回答 2

1

我只想在他们在一起时选择“引文”[note]。

但是,在您的情况下它们并不在一起:引号和方括号之间有一个换行符分隔符。您需要修改您的表达式以解决此问题。当然,您还需要转义方括号。

此外,您应该使用[\s\S]+?防止回溯的表达式替换不情愿地限定内容的表达式,如下所示:

("[^"]+"\s\[[^\]]+\])

最后,您需要打开正则表达式引擎的“多行”选项。这特定于您的正则表达式环境 - 在 Java 中,您使用MULTILINE模式;在 .NET 中是RegexOptions.Multiline,依此类推。

于 2013-10-20T12:06:46.747 回答
0

这是一种在 Perl 或 PCRE 正则表达式中删除坏行的方法。例如,您可以在使用 PCRE 的 Notepad++ 中执行此操作。演示显示您选择了坏线。

(?m)^\s*(?:(\[(?:[^][]++|(?1))*\])|(?<!\\)"(?:\\"|[^"])*+")(*SKIP)(*F)|.*

基本上,主交替运算符左侧的表达式|匹配所有全括号和双引号字符串,然后故意失败并跳到字符串中的下一个位置。这使得.*最后的行可以自由匹配剩余的行,这些行是您要替换的行。

有关其工作原理的详细信息,请参阅有关匹配(或替换)模式的问题,不包括....。

于 2014-06-16T09:36:32.800 回答