如何使用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在关闭之前。