EmEditor 正则表达式语言基于 Perl 正则表达式语法。
文字
所有字符都是文字除了: ".", "*", "?", "+", "(", ")", "{", "}", "[", "]", "^", "$" 和 "\"。这些字符代表文字当之前有一个 "\" 时。一个文字是一个与它自己相匹配的字符。例如,搜索 "\?" 会匹配每一个在文档中的 "?" ,或搜索 "Hello" 会匹配每一个在文档中的 "Hello" 。
元字符
下列表格包含元字符(非文字)的完整列表以及这些元字符在正则表达式中的行为
\ | 把下一个字符标记为一个特殊字符,一个文字,或一个向后引用。例如,'n' 与字符 "n" 相匹配。而 '\n' 代表一个换行符号。序列 '\\' 代表 "\","\(" 则与 "(" 相匹配。 |
^ | 匹配输入字符串的开始位置。例如,"^e" 表示任何由 "e" 开头的字符串。 |
$ | 匹配输入字符串的结尾位置。例如,"e$" 表示任何由 "e" 结尾的字符串。 |
* | 匹配之前的字符或子表达式零次或多次。例如,zo* 会匹配 "z" 以及 "zoo"。* 等同于 {0,}。 |
+ | 匹配之前的字符或子表达式一次或多次。例如,'zo+' 匹配 "zo" 以及 "zoo",但不匹配 "z"。 + 等同于 {1,}。 |
? | 匹配之前的字符或子表达式零次或一次。例如,"do(es)?" 匹配 "do" 在 "do" 或 "does" 中。? 等同于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不匹配 "Bob" 中的 "o",但与 "food" 中的两个 o 匹配。 |
{n,} | n 是一个非负整数。匹配至少 n 次。例如,'o{2,}' 不匹配 "Bob" 中的 "o",单匹配 "foooood" 中的所有 o。and matches all the o's in "foooood". "o{1,}" 等同于 'o+'。 'o{0,}' 等同与 'o*'。 |
{n,m} | m 和 n 都要是非负整数,n <= m。匹配至少 n 次,最多 m 次。例如,"o{1,3}" 与 "fooooood"中的前三个 o 向匹配。 'o{0,1}' 等同于 'o?'。要注意的是你不能在逗号与数字之间加一个空格。 |
? | 当这个字符紧跟着任何其他数量词 (*, +, ?, {n}, {n,}, {n,m}) 时,匹配的模式是非贪婪。一个非贪婪模式尽可能少地与搜索字符串匹配,而默认的贪婪模式则尽可能多地与搜索字符串匹配。例如,字符串 "oooo",'o+?' 匹配单一的一个 "o",而w 'o+' 匹配所有 'o'。 |
. | 与任何单一字符串匹配。例如,".e" 匹配任何在 "e" 之前的文字,如 "he","we",或 "me"。 在 EmEditor Professional 中,它匹配搜索正则表达式的附近行文本框中指定范围内的换行当正则表达式 "." 匹配换行符复选框被勾选。 |
(pattern) | 括号有两个作用: 把一个格式组合到一个子表达式中,以及捕捉生成该匹配的格式。例如,表达式 "(ab)*" 匹配所有字符串 "ababab"。每一个子表达式的匹配被捕捉为一个从左到右编号的向后引用(如下)。要匹配括号字符,用 '\(' 或 '\)'。 |
(?<name>pattern) | 捕获与 "pattern" 匹配的字符串到 "name" 群组中。 |
\1 - \9 | 指定一个向后引用 - 一个向后引用是上一个被匹配的子表达式的引用。引用的内容是与子表达式相匹配的内容,而不是表达式本身。一个向后引用由转义符 "\" 加一个 "1" 到 "9" 的数字组成。"\1" 指的是第一个子表达式,"\2" 是第 2 个,以此类推。例如,"(a)\1" 会捕捉 "a" 为第一个向后引用,并匹配任何 "aa" 文本。你还可以使用向后引用功能当你在搜索菜单下选择替换功能时。用正则表达式来定位一个文本格式,与之相匹配的文本能被一个指定的向后引用替换。例如,"(h)(e)" 的表达式会在文本中查找 "he",把 "\1" 放在替换为文本框中会用 "h" 取代 "he", 而如果是 "\2\1" 的话,则会用 "eh" 取代 "he" 。 |
\k<name> | 表示一个已命名的向后引用。已命名的向后引用是用以下形式引用之前匹配的已命名的捕获组:(?<name>expression)。如果 "name" 是一个数字,则它表示一个已编号的向后引用,相当于 \1,\2,\3,...。 |
(?:pattern) | 一个与格式相匹配,但不捕获该匹配的子表达式,这是一个不能用向后引用来存储的非捕获匹配。这个表达式通常和 "or" 字符 (|) 组合使用。例如,'industr(?:y|ies) 是一个比 'industry|industries' 更实用的表达式。 |
(?=pattern) | 子表达式执行匹配 lookahead 搜索,查找任何后面跟着符合的模式的字符串。例如,"x(?=abc)" 与 "x"相匹配仅当字符串后面跟着 "abc" 表达式时。 这是一个不能用向后引用来存储的非捕获匹配。模式不包含换行。 |
(?!pattern) | 子表达式执行非匹配 lookahead 搜索,查找任何后面没有跟着符合的模式的字符串。例如,"x(?!abc)" 与 "x" 相匹配只有当该字符串后面不跟着 "abc" 表达式时。这是一个不能用向后引用来存储的非捕获匹配。模式不包含换行。 |
(?<=pattern) | 子表达式执行匹配 lookbehind 搜索,查找任何前面是符合的模式的字符串。例如,"(?<=abc)x" 匹配一个 "x" 只有当它前面有表达式 "abc"时。这是一个不能用向后引用来存储的非捕获匹配。模式不包含换行。模式必须是固定长度。 |
(?<!pattern) | 子表达式执行非匹配 lookbehind 搜索,查找任何前面不是符合模式的字符串。例如,"(?<!abc)x" 匹配 "x" 只有当它前面不跟着 "abc" 表达式时。这是一个不能用向后引用来存储的非捕获匹配。模式不包含换行。模式必须是固定长度。 |
x|y | 与 x 或 y 向匹配。例如,'z|food' 与 "z" 或 "food" 匹配。'(z|f)ood' 与 "zood" 或 "food" 匹配。 |
[xyz] | 字符集。匹配任何在括号内的字符。例如,'[abc]' 与 "plain" 中的 'a' 相匹配。 |
[^xyz] | 负字符集。匹配任何不在括号内的字符。例如,[^abc]' 与 "plain" 中的 'p' 相匹配。 |
[a-z] | 字符范围。与任何指定范围的字符相匹配。例如,'[a-z]' 与任何 'a' 到 'z' 的小写字母相匹配。 |
[^a-z] | 负字符范围。与任何不在指定范围内的字符相匹配。例如,'[a-z]' 与任何不在 'a' 到 'z' 范围内的字符相匹配。 |
字符类
下面的字符类被用在字符集中,例如 "[:classname:]"。例如,"[[:space:]]" 是所有空白字符的集合。
alnum | 任何语言字符及数字: 字母,音节或表意字符。 |
alpha | 任何语言字符: 字母,音节或表意字符。 |
blank | 任何空白字符,空格或 tab。 |
cntrl | 任何控制字符。 |
digit | 任何 0-9 的数字。 |
graph | 任何图形字符。 |
lower | 任何 a-z 的小写字符,以及其他小写字符。 |
任何可打印的字符。 | |
punct | 任何标点字符。 |
space | 任何空白字符。 |
upper | 任何 A-Z 的大写字母,以及其他大写字符。 |
xdigit | 任何十六进制数字字符,0-9,a-f 还有 A-F。 |
word | 任何单词字符 - 所有字母数字字符以及下划线。 |
unicode | 任何大于 255 代码的字符。 |
单一字符转义序列
下列转义序列是单一字符的别名:
0x07 | \a | 响铃字符。 |
0x0C | \f | 换页 (FF)。 |
0x0A | \n | 换行字符。 |
0x0D | \r | 回车符。 |
0x09 | \t | Tab 字符。 |
0x0B | \v | 垂直 tab。 |
0x1B | \e | ASCII 转义符。 |
0dd | \0dd | 八进制字符代码,dd 是一个或多个八进制数字。 |
0xXX | \xXX | 一个十六进制字符代码,XX 是一个或多个十六进制数字 (一个 Unicode 字符)。 |
0xXXXX | \x{XXXX} | 一个十六进制字符代码,XXXX 是一个或多个十六进制数字 (一个 Unicode 字符)。 |
Z-'@' | \cZ Z-'@' | 一个 ASCII 转义序列控制-Z,其中 Z 是任一 ASCII 字符大于或等于 '@' 的字符代码。 |
单词边界
下列转义序列与单词的边界相匹配:
\< | 匹配一个单词的开头。(仅限 Boost.Regex) |
\> | 匹配一个单词的结尾。(仅限 Boost.Regex) |
\b | 匹配单词的边界(一个单词的开头或结尾)。 |
\B | 仅当不在单词边界处时匹配。 |
字符类的转义序列
下列转义序列能被用来表示整个字符类:
\w | 任何单词字符 - 所有字母数字字符加下划线。 |
\W | \w 的补集 - 查找任何非单词的字符。 |
\s | 任何空白字符。 |
\S | \s 的补集。 |
\d | 任何 0-9 的数字。 |
\D | \d 的补集。 |
\l | 任何 a-z 的小写字符。 |
\L | \l 的补集。 |
\u | 任何 A-Z 的大写字符。 |
\U | \u 补集。 |
\C | 任何单一字符,等同与 '.'。 |
\Q | 开始引述运算符,任何跟在该符号后面的内容会被作为一个文本字符直到找到 \E 结束引述运算符。 |
\E | 结束引述运算符,终止一个由 \Q 开始的序列。 |
替换表达式
当用正则表达式或数字范围取代时,可以用替换表达式。
下列表达式是可用于替换对话框以及在文件中替换对话框中的替换为文本框内。
\0 | 把整个正则表达式作为指定为向后引用。 | ||||||||||||||
\1 - \9 | 指定一个向后引用 - 一个向后引用是上一个被匹配的子表达式的引用。引用的内容是与子表达式相匹配的内容,而不是表达式本身。一个向后引用由转义符 "\" 加一个 "1" 到 "9" 的数字组成。"\1" 指的是第一个子表达式,"\2" 是第 2 个,以此类推。 | ||||||||||||||
$10, $11, $12, ... | 表示超过 9 个的向后引用。相当于 \k<10>,\k<11>,\k<12>,...。 | ||||||||||||||
\k<name> | 表示一个已命名的向后引用。已命名的向后引用是用以下形式引用之前匹配的已命名的捕获组:(?<name>expression)。如果 "name" 是一个数字,则它表示一个已编号的向后引用,相当于 \1,\2,\3,...。 | ||||||||||||||
\n | 一个换行符。 | ||||||||||||||
\r | 在在文件中替换表示一个回车符。 | ||||||||||||||
\t | 一个 tab。 | ||||||||||||||
\L | 强制所有后续替换字符要小写。 | ||||||||||||||
\U | 强制所有后续替换字符要大写。 | ||||||||||||||
\H | 强制所有后续替换字符要是半角字符。 | ||||||||||||||
\F | 强制所有后续替换字符要是全角字符。 | ||||||||||||||
\Nc | 强制使用 Unicode 标准化表单 C(规范组成) 转换所有后续替换字符。 | ||||||||||||||
\Nd | 强制使用 Unicode 标准化表单 D(规范分解) 转换所有后续替换字符。 | ||||||||||||||
\NC | 强制使用 Unicode 标准化表单 KC(兼容性组成) 转换所有后续替换字符。 | ||||||||||||||
\ND | 强制使用 Unicode 标准化表单 KD(兼容性分解) 转换所有后续替换字符。 | ||||||||||||||
\E | 关闭之前的 \L,\U,\F,\H,\Nc,\Nd,\NC,或 \ND。 | ||||||||||||||
\J | 指定表达式使用 JavaScript。\J 必须放在替换表达式的开头。可以与反向引用结合使用。还可以在脚本中使用 cell 函数。例如,
| ||||||||||||||
\D | 如果 数字范围表达式 的日期/时间类型用于匹配字符串,则此表达式可以指定日期格式。它可以与 \T 结合使用。查看可用的日、月、年格式。例如,如果匹配的日期/时间是 "2022-03-31 21:30":(示例的语言环境是英语(美国))
| ||||||||||||||
\T | 如果 数字范围表达式 的日期/时间类型用于匹配字符串,则此表达式可以指定时间格式。它可以与 \D 结合使用。查看可用小时、分钟 , 和第二种格式。例如,如果匹配的日期/时间是 "2022-03-31 21:30":(示例的语言环境是英语(美国))
| ||||||||||||||
(?Ntrue_expression:false_expression) | 如果匹配子表达式 N,则评估 true_expression 并将其发送到输出,否则评估 false_expression 并将其发送到输出。例如,(?1foo:bar),如果匹配子表达式 \1,会用 foo替换每个匹配,反之则用 bar。另外,您也可以用这种方式写该表达式:(?{1}foo:bar) | ||||||||||||||
$(Path) | 文件路径。 | ||||||||||||||
$(Dir) | 文件目录。 | ||||||||||||||
$(Filename) | 不带扩展名的文件名。 | ||||||||||||||
$(FilenameEx) | 带扩展名的文件名。 | ||||||||||||||
$(Ext) | 扩展名。 | ||||||||||||||
$(Lines) | 行数(不能用于在文件中替换)。 | ||||||||||||||
$(CsvColumns) | CSV 列数(不能用于在文件中替换)。 |
正则表达式的例子有哪些?
- 被双引号包围字符串
".*?"- 被 [ ] 包围的字符串
\[[^\[]*?\]- 变量名称
[a-zA-Z_][a-zA-Z_0-9]*- IP 地址
([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})- URL
(\S+)://([^:/]+)(:(\d+))?(/[^#\s]*)(#(\S+))?- 后面跟一个标签(tab)的行
\t.*$- 平假名
[\x{3041}-\x{309e}]- 全角片假名
[\x{309b}-\x{309c}\x{30a1}-\x{30fe}]- 半角假名
[\x{ff61}-\x{ff9f}]- CJK 表意文字
[\x{3400}-\x{9fff}\x{f900}-\x{fa2d}]- CJK 表意文字标记
[\x{3000}-\x{3037}]- 韩文
[\x{1100}-\x{11f9}\x{3131}-\x{318e}\x{ac00}-\x{d7a3}]- 在行的开头插入 //
查找: ^
替换为: //- 在行的开头去除 //
查找: ^//
替换为:- 清除尾部空格
查找: \s+?$
替换为:- 把 (abc) 替换为 [abc]
查找: \((.*?)\)
替换为: \[\1\]- 把 <H3 ...> 替换为 <H4 ...>
查找: <H3(.*?)>
替换为: <H4\1>- 把 9/13/2003 替换为 2003.9.13
查找: ([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})
替换为: \3\.\1\.\2- a 到 z 的大写字符
查找: [a-z]
替换为: \U\0- 使所有单字大写
查找: ([a-zA-Z])([a-zA-Z]*)
替换为: \U\1\L\2
Perl正则语法参考:
本文出自EmEditor官方中文帮助文档,为了方便记忆查看,特整理出来。