如何使用EmEditor的正则表达式智能删除文本中的日期饥饿?

在工作中,经常使用EmEditor编辑纯文本文档。最近接触到正则表达式,感觉其功能非常强大。

我现在想实现这个功能,没有更好的解决方案:在一个中英文混合的文档中,删除汉字之间的空格(包括标点),但是英文单词之间以及英文单词和字母之前的空格不能删除。只删除全角或半角空格,不删除制表符。

请专家试试。

以下是一些有用的正则表达式:

^[ \t]*\n

此正则表达式表示所有空白行,并引用包含零个或多个空格或制表符、以换行符结尾且不包含其他字符的行。

(^|(?& lt=中国)。*?(?=中国| $)

用正则表达式匹配除特定字符串以外的所有字符。指除“中国”以外的所有其他字符,类似于反向选择功能。

^[ \t]+

找到上面的字符,用空格替换,删除行首的空格(包括全角空格和制表符)。

[ \t]+$

找到上面的字符,用空格替换,删除行尾的空格(包括全角空格和制表符)。

^[ \t]+|[ \t]+$

找到上面的正则表达式,用blank替换,删除行首和行尾的所有空格(包括全角空格和制表符)。

匹配汉字的正则表达式:[\u4e00-\u9fa5]

评论:匹配中文真的很头疼。这个表达式很容易做到。

匹配双字节字符(包括汉字):[\ x00-\ xff]

注释:可以用来计算一个字符串的长度(一个双字节字符长度米2,ASCII字符米1)。

匹配空行的正则表达式:\n\s*\r

备注:可以用来删除空行。

匹配HTML标记的正则表达式:

评论:网上流传的版本太烂,上面那个只能匹配部分,但对于复杂的嵌套标签还是很无奈。

匹配前导和尾随空白字符的正则表达式:\ s * | \ s * $

注释:可以用来删除空白字符(包括空格、制表符、分页符等。)在一行的开头和结尾。这是一个非常有用的表达。

匹配电子邮件地址的正则表达式:\ w+([-+。] \ w+) * @ \ w+([-。] \ w+) * \。\ w+([-。] \ w+) *

点评:表单验证很实用。

匹配URL的正则表达式:[a-za-z]+://[\ s] *

点评:网上流传的版本功能非常有限,以上版本基本能满足需求。

匹配账户是否合法(字母开头允许5-16字节,允许字母数字下划线):[a-za-z] [a-za-z0-9 _] {4,15} $

评论:对于表单验证非常有用。

匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}

备注:匹配形式为0511-4405222或021-8788822。

匹配腾讯QQ号:[1-9][0-9]{4,}

评论:腾讯QQ号10000起。

匹配中国的邮政编码:[1-9]\d{5}(?!\d)

备注:中国的邮政编码是6位数字。

匹配的ID: \d{15}|\d{18}

评论:中国的身份证是15位数或者18位数。

匹配的ip地址:\d+\。\d+\。\d+\。\d+

注释:提取ip地址时有用。

匹配特定号码:

[1-9]\ d * $//匹配一个正整数

-[1-9]\ d * $//匹配负整数

^-?[1-9]\d*$ //匹配一个整数

[1-9]\ d * | 0 $//匹配一个非负整数(正整数+0)

-[1-9]\ d * | 0 $//匹配一个非正整数(负整数+0)

[1-9] \ d * \。\ d * | 0 \。\ d *[1-9]\ d * $/匹配一个正浮点数。

-([1-9] \ d * \。\ d * | 0 \。\ d *[1-9]\ d *)$//匹配负浮点数。

^-?([1-9]\d*\。\d*|0\。\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数。

^[1-9]\d*\.\d*|0\。\d*[1-9]\d*|0?\.0+|0$ //匹配一个非负浮点数(正浮点数+0)

^(-([1-9]\d*\.\d*|0\。\ d *[1-9]\ d *)| 0?\.0+|0$ //匹配非正浮点数(负浮点数+0)

点评:在处理大量数据时有用,具体应用中要注意修正。

匹配特定字符串:

[A-ZA-Z]+$//匹配由26个英文字母组成的字符串。

[A-Z]+$//匹配由26个大写英文字母组成的字符串。

[A-Z]+$//匹配由26个小写字母组成的字符串。

[A-ZA-Z0-9]+$//匹配由数字和26个英文字母组成的字符串。

\ w+$//匹配由数字、26个英文字母或下划线组成的字符串。

评论:一些最基本和最常用的表达

。*约翰。*$

匹配包括“John”在内的整行。

正则表达式介绍及其在e editor(Update)中的应用

蝙蝠侠2006-12-01 23:34

正则表达式确实包含了太多的内容,不可能只用一篇文章就涵盖,所以我只是简单介绍一下,举几个基本模式应用的例子。即便如此,也需要分章节连载多次~ ~ ~事不宜迟,以下正文:

正则表达式,英文正则表达式,简称Regexes或Regex。

应用程序概述:为字符串搜索和替换提供与预期搜索结果相匹配的精确文本。该技术不仅用于开发领域,还集成到一些常见的文本扩展编辑器中,如UltraEdit、Emeditor等。历史上第一个实际应用是Unix中的qed编辑器。

打个简单的比方:我们比较通配符“*”和“?”在DOS下。你应该很熟悉。例如,命令“dir *。exe”将列出所有带有exe后缀的文件名。正则表达式提供了类似的方法,并且比通配符强大得多。

从某种意义上说,正则表达式是一种语言,它可以通过很短的一行代码,高效、准确地描述待匹配的复杂文本。当然,它最大的优点也是最大的缺点:语法复杂,很难创建。(熟悉后半句可以忽略:P)

主要应用:

数据验证;通过测试字符串中的模式,这是正则表达式在开发中最常见的应用。验证输入的字符串是否是邮政编码、电话号码、电子邮件地址、信用卡号等等。

搜索和替换文本;使用正则表达式在文档中搜索特定的文本块,并根据需要用其他指定的文本块替换它们。这也是文本编辑中的一个常见应用,例如将网页中的HTML代码转换为UBB代码。

既然贴在“软件使用”板上,就不介绍正则表达式在开发中的应用了。以下只是对EmEditor中正则表达式的介绍:

1.启用正则表达式

菜单:搜索-查找(替换)-选择使用正则表达式。

2.Emeditor正则语法

正则表达式是普通字符和元字符的组合模式。它的结构类似于算术表达式的结构。各种元字符和运算符可以组合小表达式来创建大表达式。通过在一对分隔符之间放置表达式模式的各种组件,可以构造一个正则表达式。

2.1个普通字符

普通字符是指除“.”以外的字符,"*", "?"、"+"、"("、")、" { "、" } "、"[CCF]"、""、$ "和" \ "所有其他字符。这些特殊字符也可以通过添加一个“\”前缀变成普通字符。比如搜索”。

简而言之,普通角色就是只和自己匹配的角色。

2.2元字符

元字符本身不匹配,通过特殊的方式解析,实现更多的逻辑功能。正则表达式通过元字符包含模式中的选择和循环。

2.2.1特殊字符

。匹配除换行符以外的任何单个字符\ n..

()分组捕获(子表达式)的开始和结束。您可以捕获子表达式供以后使用。

[]中括号表达式的开始。

括号表达式是包含括号中的一个或多个字符列表的表达式。普通字符用括号表示,大部分特殊字符出现在括号表达式中就失去了意义。除了转义符' \ ',(要包含' \ ',需要用' \ '),比如:正则表达式No [1234]匹配No 1,No 2,No 3,No 4。

如果要将范围用作括号中的列表来匹配字符,可以使用连字符“-”来分隔范围中的开始和结束字符。单个字符的字符值决定了该范围内的相对顺序。例如,正则表达式No [1-4] = No [1234]

注1。起始值的Unicode值必须在结束值的Unicode值之前。

注2。[\-]匹配连字符'-',当将其放在括号列表的开头或结尾时,效果相同。例如,[-c-f]匹配从C到f的字符和连字符。

如果需要匹配不属于该列表或范围的任何字符,可以在列表的开头添加一个“”前缀。例如,正则表达式NO [1-4]匹配No 5和更大的数字。

括号表达式也可以组合,比如[A-Za-z0-9]匹配a-z,a-z和0-9的字符。

\将下一个字符标记为特殊字符、文本、反向引用或八进制转义字符。举个例子,

字符n匹配字符n

\n匹配换行

序列匹配

序列\(匹配(

|替换字符,通过分别匹配选择|周围的两个项目。换句话说,就是逻辑或的概念。

{}标记限定符表达式的开始。

(数量)限定字符

限定字符可以指定正则表达式的一部分必须出现的次数。

*零次或多次匹配前一个字符或子表达式。比如c*f可以匹配f和ccf。* = {0,}

+匹配前一个字符或子表达式一次或多次。比如c+f可以匹配cf和ccf,但不能匹配F. + = {1,}

匹配前一个字符或子表达式零次或一次。比如cc?f可以配cf或者ccf。?= {0,1}

{n} n是一个非负整数。恰好匹配n次。例如,c{2}f可以匹配ccf。

{n,} n为非负整数。至少匹配n次。比如c {2} f不匹配cf,但可以匹配cccccf。c{1,} = c+.c{0,} = c*

{n,m} m和n是非负整数,其中n

控制字符

\一个钟形字符。= 0x07

\f分页匹配。= 0x0C

\n换行符匹配。= 0x0A

\r匹配回车。= 0x0D

\t制表符匹配。= 0x09

\v垂直制表符匹配。= 0x0B

\e ASCII转义字符。= 0x1B

{post.abstract}dd八进制转义字符,dd代表八进制数。

\xXXXX或{XXXX} 4位十六进制Unicode字符,其中XXXX代表十六进制数。

\cZ Z-'@ '控制字符Control-Z,Z,其中Z是大于等于和" @ "的ASCII字符。

转义字符

\w任何单词字符,如a-z、A-Z、0-9、_,等等。,比如\w\w\w可以匹配U_4但不能匹配% e。

\W任何非单词字符,如\W\W可以匹配* &;但是和7#不搭

\s任何空白字符,包括空格、制表符、分页符、回车符和垂直制表符。= [ \f\n\r\t\v]

\S任何非空白字符。= [\ f \ n \ r \ t \ v]

\d 0-9的任何数字字符,如\d\d可以匹配54,但不能匹配a4。

\D任何非数字字符。例如,\D\D可以匹配a4,但不能匹配54。

\ l la和z之间的a-z小写字符,例如\l\l\l可以匹配ccf但不能匹配ccF。

\L任何非小写字符,如\L\L\L可以匹配CCF,但不能匹配cCF。

\u介于u a和Z之间的a-z大写字符,例如\u\u\u可以匹配CCF但不能匹配CCf。

\U任何非大写字符,如\ u \ u,都可以匹配ccf,但不能匹配ccF。

\C任何字符,= '。

\Q在引号之前,它后面的任何字符都被视为正常字符,直到后引号出现\ e .匹配单引号和双引号。

\E后引号

转义字符串

表示为[:classname:],如“[:space:]]”表示所有空格字符。

Alnum任意单词字符和数字字符。= [\w\d]

任何单词字符,如a-z,A-Z,0-9。

空白任何空白字符,包括空格、制表符、分页符、回车符和垂直制表符。= [ \f\n\r\t\v] = \s

控制任何控制字符。

任何数字0-9的数字字符,= \d

绘制任何图形字符。

小写a-z和z =\l之间的任何小写字符

打印任何可打印字符= ' . '= \C

点任何标点符号

空格任何空格字符

大写a-z和z = \u之间的任何大写字符

Xdigit 4位十六进制Unicode字符,= \xXXXX

word中的任意单词字符,如a-z,A-Z,0-9,_,等。= \w

unicode ASCII值大于255的任何字符。

定位字符

定位字符可以将正则表达式固定在行首或行尾。在Perl正则全集中,正则表达式也可以出现在一个单词中,出现在单词的开头或结尾。emeditor只是一个子集,不包含这个功能。

匹配输入字符串的起始位置。如果您在“自定义”中设置了“正则表达式可以匹配新行字符”,则\n或\r之后的位置也将匹配。除非用在括号表达式中,在这种情况下,它会否定字符集。

$匹配输入字符串结尾的位置。如果您在“自定义”中设置了“正则表达式可以匹配新行字符”,则$也会匹配\n或\ r之前的位置..

3.数据包捕获和替换

分组通常用于捕获一组特定模式的文本,并用于后续的替换操作,这也是为什么将分组和替换结合起来解释的原因。

最基本的分组结构是(),左右括号括起来的部分是分组;在规范的全集中,有(?& lt名称& gt)命名分组法,将模式组合在一起,对分组的部分进行命名,这样就可以通过组的命名来获取信息,但emeditor不支持这种方法。以下是不同的分组:

()群体捕捉。这种分组将括号中的模式捕获的字符进行组合,每次分组捕获的匹配结果将保存为一个实体,供后续操作使用。即使在规范的完全集中,也可以反向引用前面的分组(这是题外话,emeditor不支持)。例如:

源文本:

代码:

-

网站现状-在线会员:65,在线访客:12

-

使用正则表达式:

代码:

-

(成员|客人):\d+

-

括号中有两种可能的匹配:会员和客人,只需要匹配其中一个;后跟一个冒号和一个空格,最后至少匹配一个数字。匹配模式结果如下:

代码:

-

成员:65人

客人:12

-

其中会员和客人是在两次匹配中抓取的,可以在后续操作中引用。

(?:)非群拍。这种分组只结合括号中模式匹配的字符,模式匹配的字符不会作为一个组被捕获。虽然它也成为最终匹配结果的一部分,但不能被后续操作引用。类似地,上面的例子继续:

使用正则表达式:

代码:

-

(?:成员|客人):\d+

-

匹配模式结果也是:

代码:

-

成员:65人

客人:12

-

但会员和客人只在两次匹配中分组,并不被抓取,也不能在后续操作中引用。

使用非捕获组有其原因和场合。首先,捕获一个组需要额外的资源和处理时间,所以我们不应该捕获不需要的数据。第二,不需要处理的捕获组,在模式中有多个捕获组的情况下,只会造成组信息的混乱。第三,贪婪匹配是常规引擎的一个重要特征,可能需要阐明其机制。

使用不分组的正则表达式:

代码:

-

成员|来宾:\d+

-

匹配模式是:

代码:

-

成员

客人:12

-

这个正则表达式的问题是它匹配“成员”或“猜测:\ d+”,这是模式中贪婪的“消费”字符造成的。通过将括号添加到组中,常规引擎将两个匹配选项视为一组,从而正确匹配其中一个。

(?=)该组正在被声明,而不是被捕获。该组中的模式必须出现在声明的右侧,并且该模式不构成匹配结果的一部分。例如:

源文本:

代码:

-

网站现状-在线会员:65,在线访客:12

-

使用正则表达式:

代码:

-

\S+(?=\s\d+)

-

在这个模式中,规定\s\d+必须出现在\S+声明的右边。也就是说,一个空格字符和至少一个数字必须出现在至少一个非空格字符(声明)的右边,只有这个声明才构成匹配结果。匹配模式结果如下:

代码:

-

成员:

来宾:

-

这两个匹配没有被捕获。

(?!)负声明组,不捕获。该组中的模式不能出现在声明的右侧,并且该模式不构成匹配结果的一部分。还是用上面的例子:

使用正则表达式:

代码:

-

\d{2}(?!,)

-

在这个模式中,规定“,”不能出现在声明的右边。也就是说,要匹配的两个连续数字(声明)的右边不能出现逗号。匹配模式结果如下:

代码:

-

12

-

这两个匹配没有被捕获。

严格来说,后两个组不能称为组,只是模式声明,不能是匹配结果,也不能被捕获。& lt=)(?& lt!)和无回溯分组(?& gt),这在emeditor中不受支持。

说到括号的作用,就要说条件指令和分组内联设置是正则化中的重要指令,可惜了...emeditor也不支持~ ~ ~

前面的例子中已经提到了匹配后的操作,这个进一步操作最常见的操作就是替换。让我们先继续上面的例子:

源文本:

代码:

-

网站现状-在线会员:65,在线访客:12

-

使用搜索正则表达式:

代码:

-

(成员|嘉宾)

-

和替换正则表达式:

代码:

-

ccf-

-

匹配模式结果如下:

代码:

-

成员

客人

-

替换的文本为:

代码:

-

网站状态-在线CCF-会员:65,在线CCF-客人:12

-

其中,成员和来宾在两个匹配中被捕获,然后被引用,并添加ccf-前缀来替换源文本中的匹配字符。

匹配模式下的分组匹配结果会被正则化引擎依次赋予内部组号,在替换操作中加入这个组号就可以引用对应的匹配结果。继续上面的例子:

使用搜索正则表达式:

代码:

-

(成员|来宾):(\d{2})

-

和替换正则表达式:

代码:

-

ccf- =

-

匹配模式结果如下:

代码:

-

成员:65人

客人:12

-

替换的文本为:

代码:

-

网站状态-在线CCF-会员= 65,在线CCF-客人= 12

-

emeditor的常规子集增加了一个特殊的引用:{post.abstract},{post.abstract}将引用最后一个匹配结果,并继续put:

使用搜索正则表达式:

代码:

-

\d{2}

-

和替换正则表达式:

代码:

-

*{post.abstract}*

-

匹配模式结果如下:

代码:

-

65

12

-

替换的文本为:

代码:

-

站点状态-在线CCF-成员:*65*,在线CCF-客人:*12*

-

作为一个编辑软件,emeditor在其规范子集中添加了一些替换修饰符:

\U大写。用大写替换它后面的所有字符。

\L小写修饰。用小写替换它后面的所有字符。

\H半角修改。用半角字符替换其后的所有字符。我不得不称赞emeditor对中文的良好支持。这个\H至少对我来说是很常见的,我不喜欢在文本中看到123abc之类的全角字符。...

\F全幅装饰。用全角字符替换其后的所有字符。

\E \U,\L,\H,\F在关闭之前。