学习正则表达式
什么是正则表达式?
正则表达式是一种被用于从文本中检索符合某些特定模式的文本。
正则表达式是从左到右来匹配一个字符串的。RegularExpression这个词太长了,我们通常使用它的缩写regex或者regexp。
正则表达式可以被用来替换字符串中的文本、验证表单、基于模式匹配从一个字符串中提取字符串等等。
想象一下,您正在编写应用程序,并且您希望在用户选择用户名时设置规则。我们希望用户名可以包含字母,数字,下划线和连字符。
为了让它看起来不丑,我们还想限制用户名中的字符数量。这时我们可以使用以下正则表达式来验证用户名:
上面这个正则表达式可以匹配johndoe,johndoe和john12as。但是它不能匹配Jo,因为该字符串里面包含大写字符,并且它太短了。1。基本匹配
正则表达式只是我们用于在文本中检索字符串的模式。例如正则表达式cat,表示:字母c后面跟着一个字母a,再后面跟着一个字母t。catThecatsatonthemat
正则表达式123会匹配字符串123。通过将正则表达式中的每个字符逐个与要匹配的字符串中的每个字符进行比较,来完成正则匹配。
正则表达式通常区分大小写,因此正则表达式Cat与字符串cat不匹配。CatThecatsatontheCat2。元字符
元字符是正则表达式的基本组成元素。元字符在这里跟它通常表达的意思不一样,而是以某种特殊的含义去解释。有些元字符在写在方括号内时有特殊含义。
元字符如下:
元字符
描述
。
匹配除换行符以外的任意字符。
〔〕
字符类,匹配方括号中包含的任意字符。
〔〕
否定字符类。匹配方括号中不包含的任意字符
匹配前面的子表达式零次或多次
匹配前面的子表达式一次或多次
?
匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
{n,m}
花括号,匹配前面字符至少n次,但是不超过m次。
(xyz)
字符组,按照确切的顺序匹配字符xyz。
分支结构,匹配符号之前的字符或后面的字符。
转义符,它可以还原元字符原来的含义,允许你匹配保留字符〔〕(){}。?
匹配行的开始
匹配行的结束2。1英文句号
英文句号。是元字符的最简单的例子。元字符。可以匹配任意单个字符。它不会匹配换行符和新行的字符。例如正则表达式。ar,表示:任意字符后面跟着一个字母a,
再后面跟着一个字母r。。arThecarparkedinthegarage。2。2字符集
字符集也称为字符类。方括号被用于指定字符集。使用字符集内的连字符来指定字符范围。方括号内的字符范围的顺序并不重要。
例如正则表达式〔Tt〕he,表示:大写T或小写t,后跟字母h,再后跟字母e。〔Tt〕heThecarparkedinthegarage。
然而,字符集中的英文句号表示它字面的含义。正则表达式ar〔。〕,表示小写字母a,后面跟着一个字母r,再后面跟着一个英文句号。字符。ar〔。〕Agarageisagoodplacetoparkacar。2。2。1否定字符集
一般来说插入字符表示一个字符串的开始,但是当它在方括号内出现时,它会取消字符集。例如正则表达式〔c〕ar,表示:除了字母c以外的任意字符,后面跟着字符a,
再后面跟着一个字母r。〔c〕arThecarparkedinthegarage。2。3重复
以下元字符,或?用于指定子模式可以出现多少次。这些元字符在不同情况下的作用不同。2。3。1星号
星号表示匹配上一个匹配规则零次或多次。正则表达式a表示小写字母a可以重复零次或者多次。但是它如果出现在字符集或者字符类之后,它表示整个字符集的重复。
例如正则表达式〔az〕,表示:一行中可以包含任意数量的小写字母。〔az〕Thecarparkedinthegarage21。
星号可以与元符号。用在一起,用来匹配任意字符串。。星号可以与空格符s一起使用,用来匹配一串空格字符。
例如正则表达式scats,表示:零个或多个空格,后面跟小写字母c,再后面跟小写字母a,再在后面跟小写字母t,后面再跟零个或多个空格。scatsThefatcatsatonthecat。2。3。2加号
加号表示匹配上一个字符一次或多次。例如正则表达式c。t,表示:一个小写字母c,后跟任意数量的字符,后跟小写字母t。c。tThefatcatsatonthemat。2。3。3问号
在正则表达式中,元字符?用来表示前一个字符是可选的。该符号匹配前一个字符零次或一次。
例如正则表达式〔T〕?he,表示:可选的大写字母T,后面跟小写字母h,后跟小写字母e。〔T〕heThecarisparkedinthegarage。〔T〕?heThecarisparkedinthegarage。2。4花括号
在正则表达式中花括号(也被称为量词?)用于指定字符或一组字符可以重复的次数。例如正则表达式〔09〕{2,3},表示:匹配至少2位数字但不超过3位(0到9范围内的字符)。〔09〕{2,3}Thenumberwas9。9997butweroundeditoffto10。0。
我们可以省略第二个数字。例如正则表达式〔09〕{2,},表示:匹配2个或更多个数字。如果我们也删除逗号,则正则表达式〔09〕{2},表示:匹配正好为2位数的数字。〔09〕{2,}Thenumberwas9。9997butweroundeditoffto10。0。〔09〕{2}Thenumberwas9。9997butweroundeditoffto10。0。2。5字符组
字符组是一组写在圆括号内的子模式(。。。)。正如我们在正则表达式中讨论的那样,如果我们把一个量词放在一个字符之后,它会重复前一个字符。
但是,如果我们把量词放在一个字符组之后,它会重复整个字符组。
例如正则表达式(ab)表示匹配零个或多个的字符串ab。我们还可以在字符组中使用元字符。例如正则表达式(cgp)ar,表示:小写字母c、g或p后面跟字母a,后跟字母r。(cgp)arThecarisparkedinthegarage。2。6分支结构
在正则表达式中垂直条用来定义分支结构,分支结构就像多个表达式之间的条件。现在你可能认为这个字符集和分支结构的工作方式一样。
但是字符集和分支结构巨大的区别是字符集只在字符级别上有作用,然而分支结构在表达式级别上依然可以使用。
例如正则表达式(Tt)hecar,表示:匹配大写字母T或小写字母t,后面跟小写字母h,后跟小写字母e,或匹配小写字母c,后跟小写字母a,后跟小写字母r。(Tt)hecarThecarisparkedinthegarage。2。7转义特殊字符
正则表达式中使用反斜杠来转义下一个字符。这将允许你使用保留字符来作为匹配字符{}〔〕。?。在特殊字符前面加,就可以使用它来做匹配字符。
例如正则表达式。是用来匹配除了换行符以外的任意字符。现在要在输入字符串中匹配。字符,正则表达式(fcm)at。?,表示:小写字母f、c或者m后跟小写字母a,后跟小写字母t,后跟可选的。字符。(fcm)at。?Thefatcatsatonthemat。2。8定位符
在正则表达式中,为了检查匹配符号是否是起始符号或结尾符号,我们使用定位符。
定位符有两种类型:第一种类型是检查匹配字符是否是起始字符,第二种类型是,它检查匹配字符是否是输入字符串的最后一个字符。2。8。1插入符号
插入符号符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们使用正则表达式a(如果a是起始符号)匹配字符串abc,它会匹配到a。
但是如果我们使用正则表达式b,它是匹配不到任何东西的,因为在字符串abc中b不是起始字符。
让我们来看看另一个正则表达式(Tt)he,这表示:大写字母T或小写字母t是输入字符串的起始符号,后面跟着小写字母h,后跟小写字母e。(Tt)heThecarisparkedinthegarage。(Tt)heThecarisparkedinthegarage。2。8。2美元符号
美元符号用于检查匹配字符是否是输入字符串的最后一个字符。例如正则表达式(at。),表示:小写字母a,后跟小写字母t,后跟一个。字符,且这个匹配器必须是字符串的结尾。(at。)Thefatcat。sat。onthemat。(at。)34;Thefatcatsatonthemat。3。简写字符集
正则表达式为常用的字符集和常用的正则表达式提供了简写。简写字符集如下:
简写
描述
。
匹配除换行符以外的任意字符
w
匹配所有字母和数字的字符:〔azAZ09〕
W
匹配非字母和数字的字符:〔w〕
d
匹配数字:〔09〕
D
匹配非数字:〔d〕
s
匹配空格符:〔frp{Z}〕
S
匹配非空格符:〔s〕4。断言
后行断言和先行断言有时候被称为断言,它们是特殊类型的非捕获组(用于匹配模式,但不包括在匹配列表中)。当我们在一种特定模式之前或者之后有这种模式时,会优先使用断言。
例如我们想获取输入字符串4。44and10。88中带有前缀的所有数字。我们可以使用这个正则表达式(?)〔09。〕,表示:获取包含。字符且前缀为的所有数字。
以下是正则表达式中使用的断言:
符号
描述
?
正向先行断言
?!
负向先行断言
?
正向后行断言
?
负向后行断言4。1正向先行断言
正向先行断言认为第一部分的表达式的后面必须是先行断言表达式。返回的匹配结果仅包含与第一部分表达式匹配的文本。
要在一个括号内定义一个正向先行断言,在括号中问号和等号是这样使用的(?。。。)。先行断言表达式写在括号中的等号后面。
例如正则表达式(Tt)he(?sfat),表示:匹配大写字母T或小写字母t,后面跟字母h,后跟字母e。
在括号中,我们定义了正向先行断言,它会引导正则表达式引擎匹配后面跟着fat的The或the。(Tt)he(?sfat)Thefatcatsatonthemat。4。2负向先行断言
当我们需要指定第一部分表达式的后面不跟随某一内容时,使用负向先行断言。负向先行断言的定义跟我们定义的正向先行断言一样,
唯一的区别在于我们使用否定符号!而不是等号,例如(?!。。。)。
我们来看看下面的正则表达式(Tt)he(?!sfat),表示:从输入字符串中获取全部The或者the且不匹配fat前面加上一个空格字符。(Tt)he(?!sfat)Thefatcatsatonthemat。4。3正向后行断言
正向后行断言用于获取跟随在特定模式之后的所有匹配内容。正向后行断言表示为(?。。。)。例如正则表达式(?(Tt)hes)(fatmat),表示:从输入字符串中获取在单词The或the之后的所有fat和mat单词。(?(Tt)hes)(fatmat)Thefatcatsatonthemat。4。4负向后行断言
负向后行断言是用于获取不跟随在特定模式之后的所有匹配的内容。负向后行断言表示为(?。例如正则表达式(?,表示:在输入字符中获取所有不在The或the之后的所有单词cat。(?!(Tt)hes)(cat)Thecatsatoncat。5。标记
标记也称为修饰符,因为它会修改正则表达式的输出。这些标志可以以任意顺序或组合使用,并且是正则表达式的一部分。
标记
描述
i
不区分大小写:将匹配设置为不区分大小写。
g
全局搜索:搜索整个输入字符串中的所有匹配。
m
多行匹配:会匹配输入字符串每一行。5。1不区分大小写
i修饰符用于执行不区分大小写匹配。例如正则表达式Thegi,表示:大写字母T,后跟小写字母h,后跟字母e。
但是在正则匹配结束时i标记会告诉正则表达式引擎忽略这种情况。正如你所看到的,我们还使用了g标记,因为我们要在整个输入字符串中搜索匹配。TheThefatcatsatonthemat。ThegiThefatcatsatonthemat。5。2全局搜索
g修饰符用于执行全局匹配(会查找所有匹配,不会在查找到第一个匹配时就停止)。
例如正则表达式。(at)g,表示:除换行符之外的任意字符,后跟小写字母a,后跟小写字母t。
因为我们在正则表达式的末尾使用了g标记,它会从整个输入字符串中找到每个匹配项。。(at)Thefatcatsatonthemat。。(at)gThefatcatsatonthemat。5。3多行匹配
m修饰符被用来执行多行的匹配。正如我们前面讨论过的(,),使用定位符来检查匹配字符是输入字符串开始或者结束。但是我们希望每一行都使用定位符,所以我们就使用m修饰符。
例如正则表达式at(。)?gm,表示:小写字母a,后跟小写字母t,匹配除了换行符以外任意字符零次或一次。而且因为m标记,现在正则表达式引擎匹配字符串中每一行的末尾。。at(。)?Thefatcatsatonthemat。。at(。)?gmThefatcatsatonthemat。常用正则表达式正整数:d负整数:d电话号码:?〔ds〕{3,}电话代码:?〔ds〕(?〔ds〕{10,}整数:?d用户名:〔wd。〕{4,16}字母数字字符:〔azAZ09〕带空格的字母数字字符:〔azAZ09〕密码:(?。{6,})((?。〔AZaz09〕)(?。〔AZ〕)(?。〔az〕))。电子邮件:(〔azAZ09。〕〔azAZ09。〕。〔azAZ〕{2,4})IPv4地址:((?:(?:25〔05〕2〔04〕〔09〕〔01〕?〔09〕〔09〕?)。){3}(?:25〔05〕2〔04〕〔09〕〔01〕?〔09〕〔09〕?))小写字母:(〔az〕)大写字母:(〔AZ〕)网址:(((httphttpsftp):)?(〔〔azAZ09〕。〕)(。)(〔〔azAZ09〕〕){2,4}(〔〔azAZ09〕。?〕))VISA信用卡号码:(4〔09〕{12}(?:〔09〕{3})?)日期(MMDDYYYY):(0?〔19〕1〔012〕)〔。〕(0?〔19〕〔12〕〔09〕3〔01〕)〔。〕(1920)?〔09〕{2}日期(YYYYMMDD):(1920)?〔09〕{2}〔。〕(0?〔19〕1〔012〕)〔。〕(0?〔19〕〔12〕〔09〕3〔01〕)万事达信用卡号码:(5〔15〕〔09〕{14})
沙糖桔这么甜,糖尿病人能吃吗?我是福爸,临床营养师,专注体重管理疾病营养治疗和母婴营养,希望我的回答对您有益。先说这个问题的答案糖尿病人是可以吃沙糖桔的,但是必须结合自己血糖的情况,适量的吃。再解释一下,为什么
杜仲枸杞泡酒有什么功效?谢谢邀请!杜仲枸杞泡酒有什么功效?一,杜仲补肝肾,强筋骨,安胎。治腰脊酸疼,足膝痿弱,小便余沥,阴下湿痒,胎漏欲堕,胎动不安,高血压。能清除体内垃圾,加强人体细胞物质代谢,防止肌肉
车被水泡了,电动车和燃油车哪个损失小?谢邀,我是检车家的一名二手车检测师,因为工作原因,我几乎每天都在接触汽车,所以对于这个问题我觉得我还是有点发言权的,下面就以我个人的视角来回答一下你的问题。大部分人的固有印象可能觉
庆帝为什么挡不住巴雷特?重狙巴雷特,也就是M82A1狙击步枪,以精度准射程远威力强出名,最大射程可以在3000米以上,有效射程在1500到2000米之间,时速达到800米秒,是现代狙击手的必备大杀器。庆帝
如果有一个人免费送你皮肤,你要哪个?花嫁有了独角兽有了万圣有了异域有了叮叮当有了玩偶有了红桃有了本命小蝉安琪拉。如果免费送我希望要逐梦之音或者魔法小厨娘美图拿走不谢还有一些我要逐梦之音!!!可现实是已经错过了如果有一
雷阿伦的热火绝杀和欧文的G7绝杀你更喜欢哪个?为什么?先纠正个概念。虽然G7欧文在库里面前投中的极限后仰绝命三分足够精彩,但其实不能算是绝杀。同样,雷阿伦2013年总决赛G6最后时刻的入球也并不是绝杀。绝杀凭借压哨进球反超取胜压哨扳平
联想thinkPad系列,选哪个好?主要用于编程?T系列,如果加点钱可上TxxxS系列,轻薄而且该有的接口都有,不建议x系列,接口太少就不能选别的品牌?华为小米苹果从来没用过联想华为好用鲁大师对比同类产品,看哪个性价比高,能满足需
大衣怎么穿能穿出高级感?选对颜色很重要,颜色选的对,穿起来绝对高级时髦。今年的流行色再多彩,也不要忘了咖啡色这个冬季的专属icon也是冬天最常见的颜色,比黑色温暖,比姜黄色百搭,而且自带温油滤镜,最能穿出
在单位里,一个是有能力的临时工,一个是正式工,如果单位就用一人,单位应该用谁?在机关事业单位中,一个是能力出众踏实肯干听使唤工资薪水还十分低廉的临时合同工,一个是普通的正式职工,如果单位只能用一个人,单位应该选择用谁?没有选择,单位如果只能留下一个人,那只能
全新朗逸plus和现款速腾哪个值得购买?朗逸是A级车,而速腾要比朗逸高半级,属于A级车。所以说,无论是从做工用料,行驶品质还是隔音降噪,以及空间舒适性上。两者都不是一个级别。同为最低配1。4T车型,速腾比朗逸贵了1。8万
北大仓和汾酒有什么区别?哪个更好?北大仓酒,是黑龙江北大仓集团有限公司出品的一款白酒,企业标准50度,这款酒是酱香型白酒,酒质微黄,有北国茅台之称,口感有麸曲的酱香,高梁酒的特殊味道,回味有香甜,不那么醇厚,略显单