如何在notepad++中使用正则表达式

作为一个轻量级的文本编辑软件,notepad++一直是windows中高频使用软件之一,特别是临时记录一段文字一段代码之类的,随手用随手扔,主要又太轻量级,甚至某段字符串或者其他数据结构的一些替换处理,都会选择使用notepad++,但是遇到复杂的搜索格式,只能借助于正则,而notepad++对其又有很好地支持,不选择它又能选择谁呢?

notepad中正则表达式的语法

首先,注意Notepad++正则表达式字符串最长不能超过69个字符。

第二,notepad中的正则表达式语法与通用的正则表达式语法以及python re模块中支持的正则表达式语法都没有没有实质区别,列举如下:

  • \ 转义字符 如:要使用 “\” 本身, 则应该使用“\”
  • \t Tab制表符 注:扩展和正则表达式都支持
  • \r 回车符CR 注:扩展支持,正则表达式不支持
  • \n 换行符LF 注:扩展支持,正则表达式不支持
  • \r\n 正则表达式可表示回车换行
  • . 匹配任意一个字符
  • ^ 其右边的表达式被匹配在行首。如:^A匹配以“A”开头的行
  • $ 其左边的表达式被匹配在行尾。如:e$匹配以“e”结尾的行
  • | 或运算符,匹配表达式左边和右边的字符串。如:ab|bc匹配“ab”或“bc”
  • [] 匹配列表中任意单个字符。如:[ab]匹配“a”或“b”;[0-9]匹配任意单个数字
  • [^] 匹配列表之外的任意单个字符。如:[ab]匹配“a”和“b”以外的单个字符;[0-9]匹配任意单个非数字字符
  • *其左边的字符被匹配任意次(0次或多次)。如:be*匹配“b”,“be”或“bee”
  • + 其左边的字符被匹配至少一次(1次或多次)。如:be+匹配“be”或“bee”,但不匹配“b”
  • ? 其左边的字符被匹配0次或者1次。如:be?匹配“b”或“be”,但不匹配“bee”;\r?\n匹配行结尾符
  • () 影响表达式匹配的顺序(类似C++的小括号会影响表达式运算顺序),并且用作表达式的分组标记(标记从1开始)如:([a-z]bc)smn\1匹配“tbcsmntbc”;另见:看下文的示例
  • {} 指定前面的字符或分组的出现次数 如:abc{3}匹配abccc;a(bc){2}匹配abcbc
  • \d 匹配一个数字字符。等价于:[0-9]
  • \D \d取反,匹配一个非数字字符。等价于:[^0-9]
  • \s 匹配任意单个空白字符:包括空格、制表符等(注:不包括换车符和换行符)。等价于:[ \t]
  • \S \s取反的任意单个字符。
  • \w 匹配包括下划线的任意单个字符。等价于:[A-Za-z0-9_]
  • \W \w 取反的任意单个字符。等价于:[^A-Za-z0-9_]
  • \b 匹配单词起始处或结尾处

notepad中常用的正则表达式类

下表中列举的内容,左侧pattern 或者meaning列中的冒号后面的表达式,都可以用于在notepad 查找窗口中的正则表达式模式下的查找目标,就可以匹配相应的内容。

PatternMeaning
[[:alpha:]]匹配一个英文字母: [A-Za-z]
[[:digit:]]匹配一个数字: [0-9]
[[:xdigit:]]匹配一个十六进制数字: [0-9A-Fa-f]
[[:alnum:]]匹配一个字母数字: [0-9A-Za-z]
[[:lower:]]匹配一个小写英文字母: [a-z]
[[:upper:]]匹配一个大写英文字母: [A-Z]
[[:blank:]]匹配一个空白(空格或者制表符):[ \t]
[[:space:]]匹配一个空白符:[ \t\r\n\v\f]
[[:graph:]]匹配一个图形字符: [\x21-\x7E]
[[:print:]]匹配可打印字符(图形字符和空格)
[[:cntrl:]]匹配控制(control)字符
[[:punct:]]匹配一个标点字符:[-!”#$%&’()*+,./:;<=>?@[]_`{

notepad中查找窗口的关于正则表达式的参数说明

  • 正则表达式的选中点:表示你在查找中输入的内容是一个正则表达式
  • 匹配新行的复选框:如果如果选中该复选框,则表示使用点时,不是针对每一行而是针对整个文档进行搜索。大多数的使用场景下,不勾选该复选框。

notepad正则表达式不能选择匹配内容

注意:notepad++ 不支持匹配提取。 一般操作正则表达式主要是用来匹配查找、匹配替换。

这个提取问题可以使用sublime text来进行实现, SublimeText可以选中所有匹配项。
另外EmEditor也可以选中正则表达式的匹配项,但是EmEditor这个软件不是开源的,也不是免费的,所以推荐还是使用sublime text。

notepad正则表达式使用举例

正则表达式提取分隔符前的内容

举例:notepad文档中的输入内容如下(注意以下每行结尾都有换行符CR|LF)

1
2
3
libX11-1.6.5
lksctp-tools-1.0.17
mailcap-2.1.41

ctrl H, 查找目标输入 ([^-]*).*

替换为输入,\1

点击全部替换后的结果为

1
2
3
libX11
lksctp
mailcap

正则表达式替换一个分隔符为换行符

原始文档为

1
libX11;lksctp;mailcap;

ctrl H, 查找目标输入 ;

替换为输入,\r\n

点击全部替换后的结果为

1
2
3
libX11CR|LF
lksctpCR|LF
mailcapCR|LF

删除多余的空行

原始文档内容为

1
2
3
4
5
6
libX11CR|LF
CR|LF
CR|LF
lksctpCR|LF
CR|LF
mailcapCR|LF

目标是,删除多余的空行。
ctrl H, 查找目标为\r\n\r\n
替换为输入\r\n
点击全部替换,全部替换也需要多点击2次,就可以看到所有的空行被删除了。
替换后结果为:

1
2
3
libX11CR|LF
lksctpCR|LF
mailcapCR|LF

正则匹配并按匹配组进行替换

正则表达式支持带标记的表达式(tagged expressions)。使用包围要标记的文本,然后在替换字符串中使用\ 1替换第一个匹配的文本,用\ 2替换第二个匹配的文本,即可完成此操作。举例如下:

Text bodySearch stringReplace stringResult
Hi my name is Fredmy name is (.+)my name is not \1Hi my name is not Fred
The quick brown fox jumped over the fat lazy dogbrown (.+) jumped over the (.+)brown \2 jumped over the \1The quick brown fat jumped over the fox lazy dog