EmEditor与正则表达式

EmEditor与正则表达式

  正则表达式,英文 Regular expression,简写Regexes或Regex。
  应用概述:提供与预期的搜索结果匹配的确切文本来进行字符串的搜索和替换操作,这种技术不仅仅用于开发领域,更被集成到一些常见的文本扩展编辑器,如UltraEdit、EmEditor等。历史上第一个实用应用程序是Unix 中的Qed 编辑器。

  举一个简单的类比:我们对DOS中的通配符"*"和"?"应该很熟悉,如命令"dir *.exe" 将列出所有后缀名为exe的文件名。正则表达式提供的方法与其类似,而且远比通配符强大的多。
  从某种意义上说,正则表达式是一种语言,通过及其简短的一行代码即可以高效、精确的描述要匹配的复杂文本,当然,它最大的优点也是他最大的缺点:语法复杂,创建困难。
  主要应用:
  数据验证 这是正则表达式在开发中最常见的应用,通过测试字符串内的模式。来验证输入的字符串是否为邮政编码、电话号码、电子邮件地址、信用卡号码等等。
  搜索和替换文本 用正则表达式来搜索文档中的特定文本块,根据需要用其他指定的文本块进行替换。这也是文本编辑中的一个常见应用,如将网页中的HTML代码转化为UBB代码。
  既然发在“软件使用”板,正则表达式的开发应用就不介绍了,以下仅以EmEditor中的正则表达式来作介绍:
  1.启用正则表达式
  菜单:搜索-查找,选中“使用正则表达式”。
  2. Emeditor 正则语法
  正则表达式是普通字符和元字符组合的一种模式。它的结构与算术表达式的结构类似,各种元字符和运算符可以将小的表达式组合起来,创建大的表达式。通过在一对分隔符之间放置表达式模式的各种组件,就可以构建正则表达式。
  2.1 普通字符
  普通字符是指除了 " . "、 "*"、"?"、 "+"、 "("、 ")"、 "{"、 "}"、 "["、 "]"、"^"、 "$" 和 "\" 这些特殊字符之外的所有其他字符。而这些特殊字符也可以通过前面加上"\"前缀而变为普通字符。比如,搜索"CCF"即为在文本中匹配所有的"CCF"字符串,搜索"\[CCF\]"则是在文本中匹配所有的"[CCF]"字符串。
  简而言之,普通字符即为只匹配自身的字符。
  2.2 元字符
  元字符不匹配其自身,它用特殊方式来解析从而实现更多的逻辑功能。正则表达式通过元字符在模式中包含选择和循环
  2.2.1 特殊字符
  . 匹配除换行符 \n 之外的任何单个字符。
  ( ) 分组捕获(子表达式)的开始和结束。可以捕获子表达式以供以后使用。
  [ ] 中括号表达式的开始。
  中括号表达式是在方括号内包含一个或多个字符构成的列表的表达式。普通字符在中括号内表示本身,大多数特殊字符在中括号表达式内出现时失去它们的意义。除了转义字符'\',(要包含'\',需要使用'\\') 如:正则表达式 No [1234] 匹配 No 1,No 2,No 3 和 No 4。
  如果想在中括号中使用一个范围作为列表来匹配字符,可以用连字符 '-' 将范围中的开始字符和结束字符分开。单个字符的字符值确定范围内的相对顺序。如:正则表达式 No [1-4] = No [1234]
  注意
  ①开始值的Unicode值必须在结束值Unicode值的前面。
  ②[\-]匹配连字符'-',放在中括号列表的开始或结尾也可起到同样的效果,如 [-c-f] 匹配 c 至 f 的字符和连字符
  如果需要匹配不属于列表或范围内的任何字符,可以在列表开头加上'^'前缀。如:正则表达式 No [^1-4] 匹配 No 5 和更大的编号。
  中括号表达式还可进行组合,如 [A-Za-z0-9] 匹配A-Z,a-z,0-9 的字符
  \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如:
  ①字符 n 匹配字符 n
  ②\n 匹配换行符
  ③序列 \\ 匹配 \
  ④序列 \( 匹配 (
  | 替换字符,对 | 左右的两个项分别匹配进行选择。或者说,就是逻辑的OR的概念。
  { } 标记限定符表达式的开始。
  (数量)限定字符
  限定字符能够指定正则表达式的某个部分必须出现的次数
  * 零次或多次匹配前面的字符或子表达式。如,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,而可以匹配 ccccccf。c{1,} = c+,c{0,} = c*。
  {n,m} m 和 n 是非负整数,其中 n <= m。至少匹配 n 次,至多匹配 m 次。如,c{1,3} 可以匹配 ccf 中的cc。c{0,1} = c?。
  2.2.2 控制字符
  \a Bell 字符。= 0x07
  \f 换页符匹配。= 0x0C
  \n 换行符匹配。= 0x0A
  \r 匹配一个回车符。= 0x0D
  \t 制表符匹配。= 0x09
  \v 垂直制表符匹配。= 0x0B
  \e ASCII 换码字符。= 0x1B
  \0dd 八进制换码字符,dd代表八进制数字。
  \xXXXX或\x{XXXX} 4位十六进制Unicode字符,XXXX代表十六进制数字。
  \cZ Z-'@' 控制字符Control-Z,Z为大于等于"@"的ASCII字符
  2.2.3 换码字符
  \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 a-z 之间的任一小写字符,如 \l\l\l可以匹配 ccf 但不匹配 ccF
  \L 任一非小写字符,如 \L\L\L可以匹配 CCF 但不匹配 cCF
  \u a-z 之间的任一大写字符,如 \u\u\u可以匹配 CCF 但不匹配 CCf
  \U 任一非大写字符,如 \U\U\U可以匹配 ccf 但不匹配 ccF
  \C 任一字符,\C =.
  \Q 前置引号符,其后的任意字符均被认为普通字符直至出现后置引号符\E。同时匹配单引号和双引号
  \E 后置引号符
  2.2.4 转义字符串
  表示为[:classname:],如"[[:space:]]"表示所有的空格字符
  alnum 任一单词字符和数字字符。= [\w\d]
  alpha 任何一个单词字符,如A-Z,a-z,0-9
  blank 任一空白字符,包括空格、制表符、换页符、回车符和垂直制表符。= [ \f\n\r\t\v] = \s
  cntrl 任一控制字符。
  digit 0-9的任一数字字符,= \d
  graph 任一图形字符。
  lower a-z 之间的任一小写字符 =\l
  print 任一可打印字符 = '.' = \C
  punct 任一标点符号
  space 任一空格字符
  upper a-z 之间的任一大写字符 = \u
  xdigit 4位十六进制Unicode字符,= \xXXXX
  word 任何一个单词字符,如A-Z,a-z,0-9,_等,= \w
  unicode 任何一个ASCII值大于255的字符
  2.2.5 定位字符
  定位字符可以把正则表达式固定到行首或行尾。在Perl正则全集中还能使正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾,EmEditor只是一个子集,不包含这个功能。
  ^ 匹配输入字符串开始的位置。如果设置customize中的"regular expressions can match new line characters",那么 ^ 还匹配 \n 或 \r 后面的位置。 但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。
  $ 匹配输入字符串结尾的位置。如果设置customize中的"regular expressions can match new line characters",那么 $ 还匹配 \n 或 \r 前面的位置。
  3.分组捕获和替换
  分组通常用来捕获特定模式的一组文本,并用与之后的替换操作,这也就是将分组和替换结合起来讲解的原因。
  最基本的分组构造方式就是(),在左右括号中括起来的部分,就是一个分组;在正则全集中还有如(? )的命名分组方式,这种方式组合了模式在就是对分组的部分进行了命名,这样就可以通过该组的命名来获取信息,但这种方式在EmEditor中不被支持。以下分别来介绍各种不同的分组:
  () 组捕获。这种分组对模式在括号内所捕获的字符进行组合,并且每个分组捕获的匹配结果都将保存为一个实体以备其后的操作所引用。甚至在正则全集中还可对前面的分组进行反向引用(这是题外话,EmEditor不支持)。举例说明:
  源文本:
  代码:
  site status- online members:65,online guests:12
  使用正则表达式:
   (members|guests):其后是冒号和一个空格,最后匹配至少一个数字。匹配模式结果如下:
  members:65
  guests:12
  其中members和guests在两次匹配中被捕捉,可以在随后的操作中引用。
   (?:) 非组捕获. 这种分组仅仅对模式在括号内所匹配的字符进行组合,模式所匹配的字符将不会作为一个组来捕获. 虽然他也同样成为最终的匹配结果的一部分,但无法为其后的操作所引用. 同样以上例继续:
   (?:members|guests):\d+
  匹配模式结果同样为:
  但是members和guests仅仅在两次匹配中被分组,并不被捕获,也不可以在随后的操作中引用。
  使用非捕获组有其原因和场合. 其一,从效率上说,捕获一个分组需要消耗额外的资源和处理时间,所以不应该捕获不需要使用的数据. 其二,对模式中有多个捕获组的情况,对不需要处理的分组进行捕获只会对分组信息造成混乱. 其三,避免不需要贪婪匹配的场合发生贪婪匹配,贪婪匹配是正则引擎的一个重要特性,要说清楚其机理可能还需要另外开一个专题了,对这一点,还以上例说明一下:
  使用不带分组的正则表达式:
  members|guests:\d+
  匹配模式为:
  members
  这个正则表达式的问题在于,他匹配的是"members" 或 "guests:\d+",这是模式中贪婪"消费"字符引起的。 而通过增加括号进行分组,使正则引擎将两个匹配选项作为一个组处理,从而正确匹配其中的一个匹配项。
   (?=) 正声明组,非捕获. 此分组中的模式必须出现在声明的右侧,并且,这个模式不构成匹配结果的一部分. 举例:
  \S+(?=\s\d+)
  此模式中规定了\s\d+必须出现在\S+声明的右侧. 也就是说,在至少一个非空格字符(声明)的右侧必须出现一个空格字符和至少一个数字,而且只有这个声明构成匹配结果. 匹配模式结果如下:
  members:
  guests:
  这两次匹配中不被捕捉。
  (?!) 负声明组,非捕获. 此分组中的模式不得出现在声明的右侧,并且,这个模式不构成匹配结果的一部分. 还是用上面的例子:
  \d{2}(?!,)
  此模式中规定了","不得出现在\d{2}声明的右侧. 也就是说,在连续两个数字(声明)的右侧不得出现逗号才能被匹配. 匹配模式结果如下:
  12
  严格的说,后面两个分组不能称之为分组,他们只是模式声明,他们不能成为匹配结果,也不能被捕获. 在正则全集中,还有反向声明分组(?<=)(?),在EmEditor中不被支持。
  说到括号的功能,本来正则中的一个重要指令-条件指令和分组内联设定是不得不说的,可惜的是... EmEditor也同样不支持~~~~
  在前面的例子中一直提到匹配之后的操作,而这个进一步的操作最常见的就是替换. 先继续上面的例子:
  使用搜索正则表达式:
  (members|guests)
  和替换正则表达式:
  ccf-\1
  匹配模式结果如下:
  guests
  替换后的文本为:
  site status- online ccf-members:65,online ccf-guests:12
  其中members和guests在两次匹配中被捕捉,在随后被引用,并添加ccf-前缀后替换源文本中的匹配字符。
  在匹配模式中的分组匹配结果将按前后顺序被正则引擎分别赋予内部组号,在替换操作中就可以用\加上这个组号来引用相应的匹配结果. 继续上例:
  (members|guests):(\d{2})
  ccf-\1 = \2
  site status- online ccf-members = 65,online ccf-guests = 12
  在EmEditor的正则子集中增加了一个特殊的引用:\0 ,\0 将引用上次的匹配结果,继续把:
  \d{2}
  *\0*
  65
  site status- online ccf-members:*65*,online ccf-guests:*12*
  作为一个编辑软件,EmEditor的正则子集中增加了一些替换修饰符:
  \U 大写修饰. 将其后的所有的字符替换为大写
  \L 小写修饰. 将其后的所有的字符替换为小写
  \H 半角修饰. 将其后的所有的字符替换为半角字符. 写到这里,不得不称许一下EmEditor对中文的良好支持,这个\H至少我是很常用的,不喜欢看到文本里面都是些123abc之类的全角字符..。
  \F 全角修饰. 将其后的所有的字符替换为全角字符
  \E 关闭之前的\U,\L,\H,\F修饰。
  4.高级运用
  (1)^[  \t]*\n
  这个正则表达式代表所有的空行,指含有零个或零个以上空格或制表符、以换行符结尾、不含其它字符的行。
   (2)(^|(?<=中国)).*?(?=中国|$)
  用正则表达式匹配特定字符串外的所有字符。指除“中国”外的所有其它字符,类似于反选功能。
  (3)^[  \t]+
  查找以上字符,并替换为空,可删除行首空白(包括全半角空格和制表符)。
   (4)[  \t]+$
  查找以上字符,并替换为空,可删除行末空白(包括全半角空格和制表符)。
  (5)^[  \t]+|[  \t]+$
  查找以上正则表达式,并替换为空,可删除行首和行末所有空白(包括全半角空格和制表符)。9FA5
  (6)[\u4E00-\u9FA5]或[一-龥]
  匹配中文字符。评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
  (7)[^\x00-\xff]
  匹配双字节字符(包括汉字在内)。评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
  (8)\n\s*\r
  匹配空白行的正则表达式。评注:可以用来删除空白行,我觉得\n[\s\t]*$更好)。
  (9)< (\S*?)[^>]*>.*?|< .*? />
  匹配HTML标记的正则表达式。评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
  (10)^\s*|\s*$
  匹配首尾空白字符的正则表达式。评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
  (11)\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  匹配Email地址的正则表达式。评注:表单验证时很实用。
  (12)[a-zA-z]+://[^\s]*
  匹配网址url的正则表达式。评注:网上流传的版本功能很有限,上面这个基本可以满足需求。
  (13)^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)。评注:表单验证时很实用。
  (14)\d{3}-\d{8}|\d{4}-\d{7}
  匹配国内电话号码。评注:匹配形式如 0511-4405222 或 021-87888822
  (15)[1-9][0-9]{4,}
  匹配腾讯QQ号。评注:腾讯QQ号从10000开始
  (16)[1-9]\d{5}(?!\d)
  匹配中国邮政编码。评注:中国邮政编码为6位数字
  (17)\d{15}|\d{18}
  匹配身份证。评注:中国的身份证为15位或18位
  (18)\d+\.\d+\.\d+\.\d+
  匹配IP地址。评注:提取IP地址时有用。
  (19)匹配特定数字:
  ^[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)
  评注:处理大量数据时有用,具体应用时注意修正
  (20)匹配特定字符串
  ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
  ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
  ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
  ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
  ^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
  ^.*John.*$   //匹配包括“John”的整行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


jquery.validate使用攻略(表单校验) 目录 jquery.validate使用攻略1 第一章&#160;jquery.validate使用攻略1 第二章&#160;jQuery.validate.js API7 Custom selectors7 Utilities8 Validato
/\s+/g和/\s/g的区别 正则表达式/\s+/g和/\s/g,目的均是找出目标字符串中的所有空白字符,但两者到底有什么区别呢? 我们先来看下面一个例子: let name = &#39;ye wen jun&#39;;let ans = name.replace(/\s/g, &#39;&#3
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母 /^[0-9a-zA-Z]*$/g jQuery.validator.addMethod(&quot;letters&quot;, function (value, element) { return this.optio
this.optional(element)的用法 this.optional(element)是jquery.validator.js表单验证框架中的一个函数,用于表单控件的值不为空时才触发验证。 简单来说,就是当表单控件值为空的时候不会进行表单校验,此函数会返回true,表示校验通过,当表单控件
jQuery.validate 表单动态验证 实际上jQuery.validate提供了动态校验的方法。而动态拼JSON串的方式是不支持动态校验的。牺牲jQuery.validate的性能优化可以实现(jQuery.validate的性能优化见图1.2 jQuery.validate源码 )。 也可
自定义验证之这能输入数字(包括小数 负数 ) &lt;script type=&quot;text/javascript&quot;&gt; function onlyNumber(obj){ //得到第一个字符是否为负号 var t = obj.value.charAt(0); //先把非数字的都
// 引入了外部的验证规则 import { validateAccountNumber } from &quot;@/utils/validate&quot;; validator.js /*是否合法IP地址*/ export function validateIP(rule, value,cal
VUE开发--表单验证(六十三) 一、常用验证方式 vue 中表单字段验证的写法和方式有多种,常用的验证方式有3种: data 中验证 表单内容: &lt;!-- 表单 --&gt; &lt;el-form ref=&quot;rulesForm&quot; :rules=&quot;formRul
正则表达式 座机的: 例子: 座机有效写法: 0316-8418331 (010)-67433539 (010)67433539 010-67433539 (0316)-8418331 (0316)8418331 正则表达式写法 0\d{2,3}-\d{7,8}|\(?0\d{2,3}[)-]?\d
var reg = /^0\.[1-9]{0,2}$/;var linka = 0.1;console.log (reg.test (linka)); 0到1两位小数正则 ^(0\.(0[1-9]|[1-9]{1,2}|[1-9]0)$)|^1$ 不含0、0.0、0.00 // 验证是否是[1-10
input最大长度限制问题 &lt;input type=&quot;text&quot; maxlength=&quot;5&quot; /&gt; //可以 &lt;input type=&quot;number&quot; maxlength=&quot;5&quot; /&gt; //没有效
js输入验证是否为空、是否为null、是否都是空格 目录 1.截头去尾 trim 2.截头去尾 会去掉开始和结束的空格,类似于trim 3.会去掉所有的空格,包括开始,结束,中间 1.截头去尾 trim str=str.trim(); // 强烈推荐 最常用、最实用 or $.trim(str);
正则表达式语法大全 字符串.match(正则):返回符合的字符串,若不满足返回null 字符串.search(正则):返回搜索到的位置,若非一个字符,则返回第一个字母的下标,若不匹配则返回-1 字符串.replace(正则,新的字符串):找到符合正则的内容并替换 正则.test(字符串):在字符串中
正整数正则表达式正数的正则表达式(包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+\d)|0)$正数的正则表达式(不包括0,小数保留两位): ^((0{1}.\d{1,2})|([1-9]\d.{1}\d{1,2})|([1-9]+
JS 正则验证 test() /*用途:检查输入手机号码是否正确输入:s:字符串返回:如果通过验证返回true,否则返回false /function checkMobile(s){var regu =/[1][3][0-9]{9}$/;var re = new RegExp(regu);if (r
请输入保留两位小数的销售价的正则: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/ 1.只能输入英文 &lt;input type=&quot;text&quot; onkeyup=&quot;value
判断价格的正则表达式 价格的正则表达式 /(^[1-9]\d*(\.\d{1,2})?$)|(^0(\.\d{1,2})?$)/; 1 解析:价格符合两种格式 ^ [1-9]\d*(.\d{1,2})?$ : 1-9 开头,后跟是 0-9,可以跟小数点,但小数点后要带上 1-2 位小数,类似 2,2
文章浏览阅读106次。这篇文章主要介绍了最实用的正则表达式整理,比如校验邮箱的正则,号码相关,数字相关等等,本文给大家列举的比较多,需要的朋友可以参考下。_/^(?:[1-9]d*)$/ 手机号
文章浏览阅读1.2k次。4、匹配中的==、an==、== an9、i9 == "9i"和99p==请注意下面这部分的作用,它在匹配中间内容的时候排除了说明:当html字符串如下时,可以匹配到两处,表示匹配的字符串不包含and且不包含空白字符。说明:在上面的正则表达式中,_gvim正则表达式匹配不包含某个字符串
文章浏览阅读897次。【代码】正则表达式匹配a标签的href。_auto.js 正则匹配herf