![删除除括号内的内容之外的所有内容?](https://linux22.com/image/1574682/%E5%88%A0%E9%99%A4%E9%99%A4%E6%8B%AC%E5%8F%B7%E5%86%85%E7%9A%84%E5%86%85%E5%AE%B9%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9%EF%BC%9F.png)
我想删除除和[
和]
之间的所有文本。如何在 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]
将匹配除a
、b
或 之外的任何字符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]