删除除括号内的内容之外的所有内容?

删除除括号内的内容之外的所有内容?

我想删除除和[]之间的所有文本。如何在 Notepad++ 中执行此操作?

输入示例:

[A B C] bla bla text here [D E F] bla bla text here [G H I] bla bla
bla here [J K L] M N O] bla bla text here [P Q R [S T U] even more bla

期望输出:

[A B C][D E F][G H I]
[J K L] M N O][P Q R [S T U]

第一行中括号以匹配的[...]对出现,这相当容易处理。第二行比较棘手:我想保留[...]对括号,即使它们包含其他括号。(我很难找到准确描述这一点的方法;请参阅示例。)

我已经开发出一些可以解决某些情况的解决方案:

答案1:

Find what:    [^\]]+(\[|$)

Replace with: \1

Gives me:
[A B C][D E F][G H I]
[J K L] M N O][S T U]

请注意,这个获得了[J K L] M N O]权利,但丢弃了[P Q R 


答案2:

Find what:    [^\[]*(\[.*?\])[^\[]*

Replace with: $1

Gives me:
[A B C][D E F][G H I]
[J K L][P Q R [S T U]

相反,这个获得了[P Q R [S T U]权利,但丢弃了 M N O]


我怎样才能让它给我我想要的东西?

答案1

我没有 Notepad++(是的,我知道;我住在山洞里),但我有vi(在 Cygwin 中),它似乎有类似的功能。这个命令

s/\(^\|]\)[^][]*\(\[\|$\)/\1\2/g

给了我您所期望的输入结果。我会解释一下,希望足够详细,以便您能够将其翻译成 Notepad++ese:

  • vi的整体结构substitute 命令是:
    s(分隔符) (查找内容) (分隔符) (替换为) (分隔符) (选项)
    其中常规分隔符为/g选项代表G全局替换(即在每一行上尽可能多地进行替换)。所以我们有
    秒/(找什么)/(用。。。来代替)/G
  • 我的找什么\(^\|]\)[^][]*\(\[\|$\)。分段(添加空格以阐明语法):
    • \( ^ \| ] \)
      这是一个捕获组 ( \(…\)),由行首 ( ^) 或组成]
    • [ ^ ][ ]
      一组字符。  [^abc]将匹配除ab或 之外的任何字符c。这将匹配除 a]或 a之外的任何字符[。(在 Unix 正则表达式中,您可以将 a 放在]一组字符的开头或紧跟在首字母 之后,从而将其包含在其中 ^。显然,在 Notepad++ 中,您可以通过使用 ? 对其进行转义来实现此目的\
    • [ ^ ][ ] *
      以上情况为零个或多个。
    • \( \[ \| $ \)
      另一个捕获组;这有点像第一个捕获组的镜像。它是[或行尾。(我们必须用 来转义 ,[使其\成为普通字符。)
  • 我的用。。。来代替\1\2
    它只是两个捕获组。

[用英语来说,我们删除除或之外] 的最大长度的字符串

  • 在第一个 之前[(即,在行首和 之间[),或者
  • 在 a]和 a之间[,或者
  • 在最后一个之后](即,在 a]和行尾之间)。

答案2

使用 Notepad++

  • Ctrl+H
  • 找什么:(?:^|(?<=]))[^][]*?(?=\[|$)
  • 用。。。来代替:LEAVE EMPTY
  • 检查环绕
  • 检查正则表达式
  • Replace all

解释:

(?:         # start non capture group
    ^       # beginning of line
  |         # OR
    (?<=])  # positive lookbehind, zero-length assertion that make sure we have a closing square bracket before
)           # end group
[^][]*?     # negative character class, any character that is not openning or closing square bracket, may appear 0 or more times, not greedy
(?=         # start positive lookahead, zero-length assertion that make sure we have after
    \[      # an openning square bracket
  |         # OR
    $       # end of line
)           # ed lookahead

给定示例的结果:

[A B C][D E F][G H I]
[J K L] M N O][P Q R [S T U]

相关内容