正则表达式[]里的五个特殊字符

正则表达式[]里的五个特殊字符

在正则表达式[]里面,主要的特殊字符有五个:[]-\^。 
它们在特定情况下,需要表达本身的字面意思,就需要做转义处理;如果不做转义处理,可能会得到其他的意义,从而得到错误的匹配结果。 
除了这五个字符以外,在[]中的.*+|都是没有任何特殊意义的,它们都表示它们本身的字面意思,也就是说,*就是*

下面深入讲解下正则表达式[]里的这五个特殊字符:

(一)[ 和 ]

因为与正则表达式[]本身冲突,因此,需要匹配其本身时,需要进行转义处理。 
例如, 
源文本:我是一名[PHP]工程师,而不是一名[Java]工程师,也不是一名[C++]工程师,更不是一名[C#]工程师。 
需求:匹配[]中的工程师类型,工程师类型由大小写字母和+#构成。 
正则:\[([a-zA-Z+#]+)\]

(二)-

一般情况下,我们会使用[0-9]或者[a-z]这样的表达式来表达数字和小写字母,也就是说,-在此处的意思是表达一个范围值,即从09和从az

如果我们想要得到一个由*-+组成的匹配时,可能有些人会写成[*-+],而且,有些时候测试用例不完整的情况下,还发现不了问题。

[*-+]这个表达式其实表示的是*的ASCII值到+的ASCII值的范围,在我们常见的字母、数字、特殊字符区间里,它刚好能匹配*+,却并没像预期那样匹配到-。甚至,如果你写成了[+-*],它还会报错,就像你不能写成[9-0]一样,它会提示你:Warning: preg_match(): Compilation failed: range out of order in character class at offset 3。而如果你写成了[-*+]或者[*+-],那么恭喜你,你碰巧写对了。

因此,对于[]中的-,如果需要表达其字面意思,除非我们把它写到了[]的开头或者结尾,我们都是需要做转义处理的,也就是[*\-+]。虽然写到开头或结尾不需要转义,但我还是建议,需要表达-本身字面意思时,最好都使用转义,这也便于维护者对于该表达式的理解。

(三)\

\本身是转义符,如果你不对它做转义,它将对其后面的字符做转义,所以,这个字符要表达其字面意思时,必须做转义,也就是\\

(四)^

^我们常见用法是[^0-9]这种,在[]中放到开头,用于表示排除,也就是非的意思。[^0-9]就表示 非[0-9]的任意字符,也就是,匹配不包含0123456789的其他任意字符。 
但是,如果^写到了[]的其他地方,也就是不在开头时,它就表示它自己的字面意思了。 
-一样,虽然在不同位置能让它的特殊功能失效,但是想要匹配其字面意思时,我还是建议大家对它进行转义处理,也就是[\^]这样。

(五) 总结

别问我为什么只有4个,请回去看看(一)里有几个。

在正则表达式[]里面,主要有五个特殊字符:[]-\^,需要表达其字面意思时,最好都对它们进行转义,而其他的任何字符,在[]都只能表达其字面意思。 
因此,特别强调一个非常常见的错误写法:[https|http] 
有些人想要表达https或者http的意思,就写了这个错误匹配,我们会发现,上面的式子其实等价[htps|],原因很简单,[]是单字符匹配,而且里面的|只能表达其字面意思。对于这个例子的改正可以用下面两种写法: 
(https|http) 和 https?。 
(https|http),利用了|字符 或 的意义,因为|的作用域是从左到右,直到遇到括号为止,因此,使用|的时候需要特别留意,一定要使用括号限定,否则又可能陷入另一个错误当中,如^https|http://,本来要表达^https://^http://,却得到了^httpshttp://。 
https?,这个利用了?的0个或1个匹配的意义,如果s?匹配0个,那么就能匹配http,如果s?匹配1个,那么就能匹配https,从而达到预期目的。

更多关于正则表达式入门的内容,请参考本站博客《我眼里的正则表达式入门教程》 
更多关于正则表达式高级的内容,请参考本站博客《深入讲解正则表达式高级教程》 
Windows正则表达式测试工具请从《正则表达式测试工具RegexBuddy-4.1.0》下载 
Mac正则表达式测试工具请从《Mac正则表达式测试工具》下载

原文地址:https://www.cnblogs.com/yumo1627129/p/8126134.html

时间: 2024-11-08 22:43:04

正则表达式[]里的五个特殊字符的相关文章

正则表达式里字符串”不包含”匹配技巧

经常我们会遇到想找出不包含某个字符串的文本,程序员最容易想到的是在正则表达式里使用,^(hede)来过滤"hede"字串,但这种写法是错误的.我们可以这样写:[^hede],但这样的正则表达式完全是另外一个意思,它的意思是字符串里不能包含'h','e','d'三个但字符.那什么样的正则表达式能过滤出不包含完整"hello"字串的信息呢? 事实上,说正则表达式里不支持逆向匹配并不是百分之百的正确.就像这个问题,我们就可以使用否定式查找来模拟出逆向匹配,从而解决我们的问

数往知来 JavaScript js正则表达式<二十五>

1.匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 评注:表单验证时很实用 2.匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 评注:网上流传的版本功能很有限,上面这个基本可以满足需求 3.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用 4.匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 评注:匹配形式如 051

JS正则表达式里的控制符

正则表达式易于使用而又让人费解,乍一看上去,就像是一行行的乱码,但是它的功能确实又不容小觑.今天整理正则时,纠正了自己的一个误解. 先缕一缕: 正则表达式的两种声明方式: 字面量.构造器 (RegExp构造器适用于必须在运行时动态生成正则表达式的情形,并且还涉及到双重转义的问题,因此优先选择字面量方法声明.) RegExp实例的两个方法: exec()://返回一个数组(一个个的捕获组) test()://返回一个布尔值 exec()涉及到了正则表达式的分组,他有四种分组:捕获型.非捕获型.向前

Java 正则表达式里find()方法的使用

import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test { public static void main (String[] args) { Pattern p = Pattern .compile ("\\d{3,5}"); Matcher m = p.matcher("123-4567812-910-11"); /*print (m.matches ());

python正则表达式里引入变量

import re def reg_exp(senten): jiqiren = "阿童木" matchObj1 = re.search( r'(你(.*?)(男|女))|(机器(.*?)(男|女))|((.*?)(男的|男|女的|女))|(.*?)(什么(.*?)(性别))', senten, re.M|re.I) matchObj2 = re.search( r''+ str(jiqiren) + '(.*?)(名字|姓名|叫什么|叫什么名|叫什么名字)', senten, re.

正则表达式入门(五)字符组

如果你想匹配10-19的偶数,可以这样: \b[1][24680]\b 也可以用下面的表达式找0-99的偶数: \b[24680]\b|\b[1-9][24680]\b 字符组取反对字符组取反会匹配与字符组内容不匹配的字符.如果你不想匹配元音字符,可以这样写 [^seiou] 起始位置的脱字符的意思就是,我不想匹配这些字符.并集与差集java支持正则的并集差集功能.如果要两个字符组并集: [0-3[6-9]] 这里会匹配0到3之间或者6到9之间的数字.匹配差集: [a-z[^m-r]] 匹配a到

正则表达式五分钟快速复习

项目小版本上线偷得半日闲,刚刚又重新看了一遍正则,这次有空仔细看,完全理解了一遍,收获很大,下面整理一下 总体 正则其实非常简单,没有太多东西,就只有几个组成部分:表示字符/表示数量/表示位置/其他 不过确实正则可读性非常差,我觉得首要原因就是组成成分混乱,所以我的技巧是分两步,第一步是断句,第二步是理解,断句非常重要 表示字符 普通字符 任意字符(元字符需要转义)(空格也是直接匹配) 元字符(匹配一类字符) . -匹配除换行符以外的任意字符 \w -匹配字母或数字或下划线或汉字(word) \

【Qt编程】html特殊字符及正则表达式

1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们来实验一下: 首先在记事本中写入一句: <font color=blue>程序例</font>#include<stdio.h> 然后就文本后缀名改为.html后,用浏览器打开,显示如下: 我们从上图可以发现include后面没有显示,但是当我们在文本中写入: <fo

grep和正则表达式详解

一.Linux上文本处理三剑客 grep:文本过滤(模式:pattern)工具: sed:文本编辑工具: awk:Linux上的实现gawk,文本报告生成器: 二.grep grep:Global search REgular expression and Print out the line,是一款文本过滤(模式:pattern)工具. 作用:文本搜索工具,根据用户指定的"模式"对目标文本逐行进行匹配检查:打印匹配到的行: 模式:由正则表达式字符及文本字符所编写的过滤条件. grep