例子详解正则表达式(二)

前言

接着例子详解正则表达式(一)往下讲。

1.特殊字符:. (小数点)

|字符|匹配规则|
|:--:|--|
|.|(小数点)匹配除换行符之外的任何单个字符。例如,/.n/将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。|

直接上例子:

var str="nay, an apple is on the tree";
// g标志表示全局搜索
var pattern = /.n/g;  // 匹配字符串中的一个2字节子串,由一个非换行符字符+n
console.log(str.replace(pattern, 'N'));  // nay, N apple is N the tree

传送门:demo


2.特殊字符:(x)

|字符|匹配规则|
|:--:|--|
|(x)|匹配 'x' 并且记住匹配项,就像下面的例子展示的那样。括号被称为 捕获括号。模式 /(foo) (bar) \1 \2/ 中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词。注意 \1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法,例如,'bar foo'.replace( /(...) (...)/, '$2 $1' )。|

补充说明:正如上面的说的,() 可以记住第一次匹配到的字串,并依次将记住的字串放在一个列表里面,然后用 \x (x = 0,1,2,3……) 可以访问列表里面的子串,用在正则表达式里面,比如上面表格中的例子/(foo) (bar) \1 \2/中的(foo), 他第一次匹配到的子串一定是 "foo" (假定父字符串中有foo),那么foo就会被记录在一个列表,然后因为foo是第一个被匹配的,所以用\1可以访问到它,所以其实上面的正则表达式等价于/foo bar foo bar /,然后肯定会疑惑,为什么不直接这样写?看下面例子:

var str1 = "foo foo",
    str2 = "fooo fooooo", 
    str3 = "foo fo";
var pattern = /(fo*) \1/;
console.log(str1.replace(pattern, "FO*"));  // 输出FO*
console.log(str2.replace(pattern, "FO*"));  // FO*oo
console.log(str3.replace(pattern, "FO*"));  // foo fo

先看上面str1的输出,是FO*,你会发现 foo foo 全部被 FO* 替换。这不就相当于父串被 /fo* foo/匹配了吗?换言之 \1 等价于 foo,然后 fo*第一次匹配的正是 foo foo中的 foo
再看str2,输出的是 FO*oo,被替换掉的部分是:fooo fooo。那么上面代码中的pattern就相当于 /fo* fooo/
再看str3,是原样输出,为什么呢?patternfo* 第一次匹配到的字串是 foo,那么pattern就等价于 /fo* foo/,显然父串中并没有匹配项,因此原样输出。
小结:()特殊字符的正则表达式,会对父串匹配两次。第一次匹配是为了将每个记录放进”列表“中,然后解析当前正则表达式为"真"正则表达式(解析当前正则表达式中的\x x=123..n),第二次才开始真正的匹配。

传送门:demo


3.特殊字符:(?:x)

|字符|匹配规则|
|:--:|--|
|(?:x)|匹配 'x' 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。来看示例表达式 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。|

补充说明:该字符和第二个特殊字符的作用有点类似,但是不同的是:该字符没有”记住“的能力。他存在意义正如表格中的介绍:

表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。
ps:{1, 2}的意思是:至少前面的字符至少出现1~2次,比如?可以写成:{0, 1}

var str1 = str2 = "many foofoofoo";
var pattern1 = /(?:foo)+/,  // 匹配父串中的 foo...foo或foo
    pattern2 = /foo+/;  // 匹配父串中的foo...o或foo

console.log(str1.replace(pattern1, "FOO"));  // 输出many FOO
console.log(str2.replace(pattern2, "FOO"));  // 输出many FOOfoofoo

说道这里,我补充一点比较重要的知识点(不论你有没有明白到这一点):正则表达式在匹配父串的时候,是逐个字符去匹配,以每个字符作为一个单位

小结:(?:x) 是将 x 作为一个单位去匹配父串

传送门:demo


  • 各位观众老爷,今天就到这里,且听下回分解。

附录

字符 作用
g 全局搜索。
字符 匹配规则
{n,m} n 和 m 都是正整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。例如,/a{1, 3}/ 并不匹配“cndy”中得任意字符,匹配“candy”中得a,匹配“caandy”中得前两个a,也匹配“caaaaaaandy”中得前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容