Grep 语法 - 如果单词以 [, all ^ 后跟 I 或 B] 开头,则必须以 ] 结尾



我正在检查我的字幕文件的格式是否正确。我正在寻找 3 个常见错误。

  1. 格式为"[00:01:22:00]"的时间戳 - 有时会忘记匹配的 ]。所以我想检查如果"["出现在一行上,它正好有上述格式的 11 个字符,然后是一个匹配的"]"常见错误是缺少匹配
  2. ]
  3. 粗体和斜体 - 如果 ^B 或 ^I 出现在一行上,则它必须在同一行中具有匹配的 ^B 或 ^I。
  4. 如果 ^ 出现在一行上,则必须后跟 I 或 B

一个正则表达式,它执行所有这些操作:

^(.*[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]]).*|.*^(?![BI]).*|([^^n]*^[^Bn])*[^^n]*^B([^^n]*^[^Bn])*[^^n]*|([^^n]*^[^In])*[^^n]*^I([^^n]*^[^In])*[^^n]*)$

只需在启用正则表达式的文本编辑器的搜索栏中输入它,它就会找到您的问题中定义的任何错误行。

我使用Notepad++(Windows)和TextWrangler(Mac)的查找功能对其进行了测试。它还应该与Python或任何其他支持负面展望的正则表达式风格一起使用。搜索时,请确保选中"正则表达式"或"grep"旁边的复选框或圆圈。请注意,此正则表达式不适用于 Linux grep,因为 grep 不支持 lookarounds。

它绝对不漂亮,但它实际上只是像^(rule1|rule2|rule3B|rule3I)$一样将 4 个较小的正则表达式推到一起。

第一条规则是:

^.*[(?![0-9][0-9]:[0-9][0-9]:[0-9][0-9]:[0-9][0-9]]).*$
它匹配具有不属于 [00:00:00

:00:00] 模式的"["的任何行,使用负前瞻。

第二条规则是:

^.*^(?![BI]).*$

它匹配任何带有"^"的行,而不是紧跟 B 或 I,再次使用负前瞻,以便它也会在行尾匹配。

第三条规则是嘟嘟囔囔:

^([^^n]*^[^Bn])*[^^n]*^B([^^n]*^[^Bn])*[^^n]*$

它将任何行与用于粗体的文字^B的一个实例匹配。([^^n]*^[^Bn])*[^^n]*部分匹配任何未^B的内容,^B部分匹配^B。我已经包含了n以防止记事本++中的多行匹配。如果您使用的是 grep 或任何已经在进行逐行正则表达式搜索的程序,则可以删除n 的。

第四条规则

只是第三条规则,用"I"代替"B"。

最新更新