TRYREGEX是一个交互式的正则表达式进修项目项目地点:https:github.comcallumacra…在线地点:http:tryregex.com翻译版在线:http:w
TRY REGEX 是一个交互式的正则表达式进修项目
项目地点:https://github.com/callumacra…
在线地点:http://tryregex.com/
翻译版在线:http://www.rakuhi.com/tryrege…
很合适正则表达式初学者进修、演习
统共28个小课程,从零基本入门到能完成大多数正则表达式誊写。
个人做了 翻译&解答,有题目的地方迎接斧正
翻译
第一课 正则表达式入门
本交互课程意在引见正则表达式,更明白的说是Javascript下的正则表达式。课程固然也会教您用其他言语写正则表达式,然则您应当晓得它们是有辨别的。
左边的掌握台就是一个Javascript掌握台。请运用 setName('Your name')
(Your name替代为您的名字)敕令设置您的姓名来最先课程。
另有一些有用的敕令:实行 help()
来检察它们
第二课 什么是正则表达式?
正则表达式(也写作 regex 或 regexp)是一个用来形貌搜刮形式的字符串——相似星号(*)文件名婚配通配符,但越发有用(固然也越发庞杂)。
我们将会从一个异常基本的例子最先,来让您掌握 Javascript 中语法和正则表达式的运用。
bio
是一个不晓得是不是包括您名字的变量。为了看看结果,请输入 bio.match(/{{ firstEscaped }}/);
。
第三课 包括!
从上个例子中您可以得知一些事变。第一,用于定义正则表达式的语法:运用两个斜杠包括表达式:
/表达式/
假如您将它输入掌握台,将会返回正则表达式。
第二,您可以对字符串运用 .match()
要领来测试正则表达式。另有一些其他要领可以挪用:您可以直接对正则表达式运用 .exec()
要领来对实行一个字符串。请输入 /{{ firstEscaped }}/.exec(bio)
。
第四课 简朴测试
.exec()
要领和 .match()
要领做的是一样的事变,但它是对表达式挪用而不是对字符串——这会很有用。
另一个可用的是 .test()
要领 ——多是这些要领中最简朴的 。相似于 .exec()
,但返回的是布尔值。试一试吧!
提醒:左边掌握台可以运用向上键来猎取之前输入的表达式。
第五课 字符串替代
我们会用到的末了一个要领是 .replace()
,用一个字符串替代另一个字符串的要领。输入一下内容来将 bio
变量中您的名字隐蔽:
bio.replace(/{{ firstEscaped }}/, '[redacted]')
第六课 迥殊字符
我们迄今为止用过的表达式都不是迥殊风趣,也没有包括迥殊字符。以下这些字符在正则表达式中应当被转义:
$()*+.?[^|]
为了躲避它们,运用反斜杠转义,比方 /what?/
。
写一个正则表达式来测试 num
变量中是不是包括字符串“3.5”。
第七课 点运算符
是不包括的!num
的值是 123456,它不包括字符串“3.5”。
在正则表达式中点运算符有迥殊的寄义:它将婚配除了换行符之外的一切的单个字符(所以 /a.c/
将会婚配 “abc”, “a c”, “a$c” 等等)。未转义点运算符直接运用 /3.5/
将可以婚配到 num
中字符串,这里点运算符将会婚配 4。
尝尝吧。
第八课 量词
有一些“量词”可以用来表达某个东西须要被婚配多少次。第一个量词是问号,作用是让前置项(一个字符或字符组)可选(即涌现0次或1次)。
表达式 /regexp?/
将会婚配 “regex” 和 “regexp”,问号让 p(只是p)可选。
写一个表达式同时能婚配”frontend” 和 “front-end”,答案经由过程 answer()
函数传参(例子:answer(/表达式/)
)。
第九课 加号
我们要进修的下一个量词是加号。它的意义是“一个或更多前置项”;/Princes+/
会婚配 “Princes”, “Princess”, “Princesssss” 等等。但不会婚配”Prince”。
您要写的下一个表达式将会有点庞杂。写一个正则表达式,抽掏出 shortStory
变量(可输入 shortStory
检察变量内容)中摆布括号间的一切内容(包括括号)。提醒:须要用到适才说过的点运算符。
第十课 星号
星号和加号相似;然则差别于“一个或更多”,星号的寄义是“零个或更多的前置项”。/Princes*/
在 /Princes+/
婚配内容的基本上还能婚配 “Prince” 。
反复上一个例子,用星号替代加号。抽掏出 shortStory
变量中摆布括号间的一切内容,即使括号内没有内容。
第十一课 限定反复次数
有一个量词可以用来限定反复次数。语法是 {min,max}
个中 min 是最小涌现次数,max 是最大涌现次数。比方 /a{3,5}/
会且只会婚配 “#”, “#a” 和 “#aa”。
写一个表达式婚配 bracketNumbers
中摆布圆括号中心长度为5~8之间的字符。
第十二课 限定反复次数进阶
为了进一步明白反复次数局限,您可以用{n}
指明白定的一个反复次数,个中 n 是反复次数。比方表达式 a{6}
只会婚配反复的六个 a。
在运用大括号时,您可以不指定最大反复个数,只留下最小反复个数。比方,/a{5,}/
会婚配5个或更屡次反复的字母 a。
用 answer()
函数给出不运用 ?*+
字符,但和 /a?b+c*/
等价的正则表达式。
第十三课 标志——不辨别大小写标志
标志用来转变正则表达式的表达形式,位于表达式的背面(例子:/表达式/ig
)。每一个标志用一个字母示意,Javascript 支撑四种标志——有两种将会在本课程中学到。i
标志让表达式不辨别大小写——在没有这个标志时 /a/
只会婚配“a”,不会婚配“A”;/a/i
则会同时婚配“a”和“A”。
实行 /CAT/i.exec('Category')
来看看 i 标志的作用。
第十四课 标志——全局婚配标志
第二个经常使用的标志是全局婚配标志,用字母 g
示意。 /a/
只会婚配字符串中第一个 a, /a/g
则会婚配每一个单个的字母 a。
写一个正则表达式,来用字母 “e” 替代 shortStory
里一切的字母 “a”。
您可以运用字符串的 .replace(expr, replace)
要领来做替代。
第十五课 字符组
字符组许可您指定一组或一个局限的字符去婚配。/[aeiou]/
婚配恣意元音字母,/[a-m]/
婚配恣意字母表前半部份的字母,/[aeiou0-9]/
婚配恣意元音字母或数字。
注重在字符组中,您不须要转义点字符,它将被直接婚配。假如您要运用连字符(-),则须要转义。
我们定义正当的用户名包括5到12个字母(大写字母或小写字母)或连字符。写一段代码,在 username
正当时返回 true。
第十六课 否认字符组
否认字符组将会婚配不在字符组内的字符。您可以在字符组前增加一个脱字号(^)来否认它。比方 /[^a-m]/
将婚配“z” 、“$”,然则不会婚配“c”。
弄清楚 “非 [a-m]” 和 “不在 [a-m] 局限” 的辨别很主要,/c[^a]t/
将婚配 “cut”,但不会婚配 “cat” 和 “ct” ——这个异常主要。
如今正当的用户名可以包括任何非空格字符(但一样长度在 5 到 12 之间)。写出一个正则表达式来磨练 username
正当性。
第十七课 范例字符
范例字符可以用作罕见字符组的简单表达。有6种范例字符:d
婚配十进制数字(0-9),s
婚配空格, w
婚配单词字符(单词字 —— Unicode字符集、数字、下划线)。
别的三个可用的范例字符是将上面三个改成大写字母,就起到了否认它们的结果;比方 S
婚配一切非空格字符。
写一个正则表达式,能婚配一个后缀一个空格一串数字的单词。用 charTypeTest
测试:不要运用任何笔墨字符。
第十八课 定位符
假如您想确保字符串以某种一定字(字符集)的最先或完毕——比方,您愿望包装字符串以大写字母最先——那末你就可以运用锚点。美圆标记($)婚配字符串末端,脱字符(^)婚配字符串最先。/^cat$/
将只会婚配到 “cat” 而不婚配其他任何字符串(/cat/
会婚配任何包括 “cat” 的字符串)。
写一个正则表达式来测试 possibleUrl
变量是不是以 “http://” 或 “https://” 最先,且从头至尾不包括任何空格。
提醒:须要用到问号、否认字符集。您可以会须要两种锚点。
第十九课 捕捉组
您可以运用圆括号来建立组,可以将多项组合起来或许保留结果以供以后援用:
/"(.+)"/
上面就是一个捕捉组的示例,意义是圆括号内婚配到的字符串将被保留在 .match()
或 .exec()
返回的数组中。
转头看看之前我们用表达式 /(.{5,8})/.exec(shorterStory)
抓取两个圆括号之间的数据的例子。尝试用圆括号包住 .{5,8}
从新运转一下。
第二十课 非捕捉组
您可以看到如今返回数组有个两项:第一项是悉数婚配内容,第二项只包括捕捉组婚配数据。
另有一种组范例叫做非捕捉组。这类组语法上稍有差别,它不在数组内存储直。假如不须要援用组,您可以偏向运用非捕捉组:它会坚持返回数组的纯洁。上一个例子中,增加 ?:
在组的最先点运算符之前,将表达式变成非捕捉组。
第二十一课 量词
和我们zhi’q没有用组险些一样。
非捕捉组的主要用途是给一个组给予量词。下面的表达式将会婚配 “I ate” 和 Carrot and I ate” 不会婚配其他内容:
/^(?:{{ firstEscaped }} and )?I ate$/
写一个表达式,可以婚配 “ha” 涌现两次或更多的字符串 (比方:“haha” 或 “hahahahaha”),用 answer()
函数给出答案。
提醒:您的表达式不应当婚配 “hahah”。运用锚点来保证这一点。
第二十二课 管道标记
您可以运用管道标记(|)来指定“或”关联。下面的表达式将婚配 “The dog ate” 和 “The cat ate”:
/The (dog|cat) ate/
您也可以运用非捕捉组,然则在这个例子中我们愿望猎取结果。您可以在一个组内用恣意多个管道标记。让上面的表达式在坚持原有婚配的基本上也可以婚配 “The rabbit ate” (带婚配串在 rabbit
变量中)。
第二十三课 反向援用
在统一个表达式中,您可以援用之前捕捉到的值。只需简朴的写成反斜杠后随着捕捉组数字(它在返回字符串里的索引值)。比方,下面的表达式将婚配 “The cat ate with the other cat” 和 “The dog ate with the other dog”,但不会婚配 “The cat ate with the other dog”(固然,这自身就挺新鲜的):
/The (dog|cat) ate with the other 1/
写一个表达式,可以婚配统一行内两个雷同的单词(比方:“hello hello world”):和之前的例子一样,用 answer()
函数给出答案。
第二十四课 RegExp对象
除了笔墨运算符(斜杠),Javascript 还供应 RegExp 组织器,许可您运用字符串去指定须要的表达式。这个关于将变量放在表达式中异常有用。它的运用要领以下:
// Same as /regexp?/ig
new RegExp('regexp?', 'ig');
用户名一样包括在变量中。 userData
变量包括用户信息:把它打印在掌握台中来检察数据格式。运用 username
变量去抽取该用户的关联词。为了可以准确考证,请把答案写在统一行。
第二十五课 高等替代
我们已晓得了两种捕捉组运用捕捉值得要领:第一种是返回数组,第二种是反向援用。您也可以在 .replace()
要领的第二个参数中猎取它:
var text = '*italic text*';
var replace = '$1';
text.replace(/\*([^*]+)\*/, replace);
写一个相似上面的代码,将 boldText
变量替代成
元素。
第二十六课 懒散 vs 贪欲 婚配
Javascript 默许的婚配形式是 “贪欲”,也就是说婚配尽量多个:
'"Hi", "Hello"'.match(/".+"/)
上面的表达式将会返回 "Hi", "Hello"
,它婚配了两个双引号间内容。懒散婚配则和贪欲婚配相反,它会婚配尽量少的——所以这个例子中,只会婚配 "Hi"
。
经由过程在量词背面加上问号来完成懒散婚配——用上面的例子尝尝吧。
第二十七课 断言
断言是一个应当被婚配但不会被存储的形式:不是 “婚配a然后婚配b” ,而是 “婚配背面连着b的a,然则不婚配b”。在 Javascript 中有两种断言范例,一定先行断言 和 否认先行断言。“先行” 就是说向前查找;Javascript 不支撑 “后行”(向后查找)。
一定先行断言示意我们想向前查找a的婚配。为了查找a b衔接,我们可以运用 /a(?=b)/
。
运用断言来从 partialSums
中掏出 “6+3”。不要运用任何数字标记,用 d
。
第二十八课 否认断言
断言也可以是不是定的,所以我们可以婚配不衔接在某项后的字符串。注重和字符组差别的是,它可以婚配到一些不一样的——假如你说 “背面不连着b的a”,a可以在字符串的末端。
否认断言的语法和一定断言的语法相似,但用感叹号(!)替代等号:比方,/a(?!b)/
会婚配背面不是字母 b 的字母 a。
用一个一定断言接一个否认断言来提取 partialSums
中的 “3+3”。
您完成了课程!
祝贺您,完成了 Try Regex 的课程。您基本上掌握了 Javascript 中正则表达式的大部份内容,如今您可以写出适用于大多数场景的正则表达式了。
下面这些是延长浏览内容(不可用链接已替代):
Mozilla Developer Network: Regular Expressions
Javascript Regular Expression Enlightenment
DZone: The Essential Regular Expressions Cheat Sheet
RegExp playground
regular-expressions.info 通用非指定言语手册
解答
正则表达式的风趣的地方就在于,关于统一个题目于有多种差别的写法。下面给出的解答有些只是准确写法中一种,仅供参考。本身思索本身尝试才真正掌握正则表达式。
第一课 正则表达式入门
第二课 什么是正则表达式?
第三课 包括!
第四课 简朴测试
第五课 字符串替代
第六课 迥殊字符
第七课 点运算符
第八课 量词
第九课 加号
第十课 星号
第十一课 限定反复次数
第十二课 限定反复次数进阶
第十三课 标志——不辨别大小写标志
第十四课 标志——全局婚配标志
第十五课 字符组
第十六课 否认字符组
第十七课 范例字符
第十八课 定位符
第十九课 捕捉组
第二十课 非捕捉组
第二十一课 量词
第二十二课 管道标记
第二十三课 反向援用
第二十四课 RegExp对象
第二十五课 高等替代
第二十六课 懒散 vs 贪欲 婚配
第二十七课 断言
第二十八课 否认断言