正则表达式排除除了“”和[]之外的所有内容,当它们彼此相邻时

时间:2013-10-20 12:02:32

标签: regex

我在Shell 2字幕中有一个带有Ghost的.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"]

我只想在他们在一起时选择“引用”[注释]。

2 个答案:

答案 0 :(得分:1)

  

我只想在他们在一起时选择“引用”[注释]。

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

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

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

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

答案 1 :(得分:0)

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

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

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

有关其工作原理的详细信息,请参阅有关Matching (or replacing) a pattern, excluding....

的问题