JavaScript RegExp 对象

require(['jquery'], function($) {

    // RegExp 对象
    // RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。
    // 直接量语法
    // /pattern/attributes
    // 创建 RegExp 对象的语法:
    var pattern = "[abc]";
    var attributes = "g";
    var myReg = new RegExp(pattern, attributes);

    // 参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
    // 参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。

    // 返回值
    // 一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。
    // 如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。

    // 方括号用于查找某个范围内的字符:

    // [abc]    查找方括号之间的任何字符。
    console.log(/[abc]/.test("abc"));
    // 结果:true
    console.log(/[abc]/.test("defg"));
    // 结果:false


    // [^abc]   查找任何不在方括号之间的字符。
    console.log(/[^abc]/.test("abc"));
    // 结果:false
    console.log(/[^abc]/.test("defg"));
    // 结果:true

    // [0-9]    查找任何从 0 至 9 的数字。
    console.log(/[0-9]/.test("a1b2c3"));
    // 结果:true
    console.log(/[0-9]/.test("abc"));
    // 结果:false

    // [a-z]    查找任何从小写 a 到小写 z 的字符。
    // [A-Z]    查找任何从大写 A 到大写 Z 的字符。
    // [A-z]    查找任何从大写 A 到小写 z 的字符。
    console.log(/[a-z]/.test("abc"));
    // 结果:true
    console.log(/[A-Z]/.test("abc"));
    // 结果:false
    console.log(/[A-z]/.test("abc"));
    // 结果:true

    // (red|blue|green) 查找任何指定的选项。
    var reg1 = new RegExp("blue|abl1");
    console.log(reg1.test("ablue"));
    // 结果:true
    console.log(reg1.test("abl1ue"));
    // 结果:true

    // 元字符(Metacharacter)是拥有特殊含义的字符:
    // .    查找单个字符,除了换行和行结束符。
    var reg2 = new RegExp("h.t");
    console.log(reg2.test("That's hot!"));
    // 结果:true (hat,hot都是)
    console.log(reg2.exec("That's hot!"));
    // 结果:["hat", index: 1, input: "That's hot!"] 查找第一个匹配,如果使用g属性,就会指向最后一个匹配的["hot", index: 7, input: "That's hot!"]

    // \w   查找单词字符。
    console.log(/\w/.exec("Give 100%!"));
    // 结果:["G", index: 0, input: "Give 100%!"]

    // \W   查找非单词字符。
    console.log(/\W/.exec("Give 100%!"));
    // 结果:[" ", index: 4, input: "Give 100%!"]

    // \d   查找数字。
    console.log(/\d/.exec("Give 100%!"));
    // 结果:["1", index: 5, input: "Give 100%!"]

    // \D   查找非数字字符。
    console.log(/\D/.exec("Give 100%!"));
    // 结果:["G", index: 0, input: "Give 100%!"]

    // \s   查找空白字符。
    console.log(/\s/.exec("Give 100%!"));
    // 结果:[" ", index: 4, input: "Give 100%!"]

    // \S   查找非空白字符。
    console.log(/\S/.exec("Give 100%!"));
    // 结果:["G", index: 0, input: "Give 100%!"]

    // \b   匹配单词边界。在单词边界匹配的位置,单词字符后面或前面不与另一个单词字符直接相邻
    // 如果未找到匹配,则返回 null。
    // /\bm/    匹配 "moon" 中的 'm';
    // /oo\b/   不匹配 "moon" 中的 'oo',因为 'oo' 后面的 'n' 是一个单词字符;
    // /oon\b/  匹配 "moon" 中的 'oon',因为 'oon' 位于字符串的末端,后面没有单词字符;
    // /\w\b\w/ 不匹配任何字符,因为单词字符之后绝不会同时紧跟着非单词字符和单词字符

    console.log(/\bWo/.exec("Hello World"));
    // 结果:["Wo", index: 6, input: "Hello World"]
    console.log(/\bor/.exec("Hello World"));
    // 结果:null

    // \B   匹配非单词边界。匹配位置的上一个和下一个字符的类型是相同的:即必须同时是单词,或必须同时是非单词字符。字符串的开头和结尾处被视为非单词字符。

    console.log(/\BWo/.exec("Hello World"));
    // 结果:null
    console.log(/\Bor/.exec("Hello World"));
    // 结果:["or", index: 7, input: "Hello World"]l


    // \n   查找换行符。
    console.log(/\n/.exec("Hello World.\nLearn Javascript."));

    // \f   查找换页符。
    // \r   查找回车符。
    // \t   查找制表符。
    // \v   查找垂直制表符。

    // \xxx 查找以八进制数 xxx 规定的字符。
    // 八进制 127 (W)
    console.log(/\127/.exec("Hello World.World is wonderful!"));
    // 结果:["W", index: 6, input: "Hello World.World is wonderful!"]

    // \xdd 查找以十六进制数 dd 规定的字符。
    // \uxxxx   查找以十六进制数 xxxx 规定的 Unicode 字符

    // 量词

    // n+   匹配任何包含至少一个 n 的字符串。
    console.log(/o+/.exec("Hello World.World is wonderful!"));
    // 结果:["o", index: 4, input: "Hello World.World is wonderful!"]

    // n*   匹配任何包含零个或多个 n 的字符串。
    console.log(/Wo*/.exec("Hello World.World is wonderful!"));
    // 对 "W" 进行全局搜索,包括其后紧跟的一个或多个 "o":
    // 结果:["", index: 0, input: "Hello World.World is wonderful!"]

    // n?   匹配任何包含零个或一个 n 的字符串。
    console.log(/10?/.exec("1, 100 or 1000?"));
    // 结果:["1", index: 0, input: "1, 100 or 1000?"] (1,10,10)都符合

    // n{X} 匹配包含 X 个 n 的序列的字符串。
    console.log(/\d{4}/.exec("100, 1000 or 10000?"));
    // 结果:["1000", index: 5, input: "100, 1000 or 10000?"] //查找四个数字,有两个匹配1000和10000里的1000

    // n{X,Y}   匹配包含 X 或 Y 个 n 的序列的字符串。
    console.log(/\d{3,4}/.exec("100, 1000 or 10000?"));
    // 结果:["100", index: 0, input: "100, 1000 or 10000?"] //查找三个数字或四个数字,有三个匹配100,1000和10000里的1000

    // n{X,}    匹配包含至少 X 个 n 的序列的字符串。
    console.log(/\d{3,}/.exec("10, 100, 1000 or 10000?"));
    // 结果:["100", index: 4, input: "10, 100, 1000 or 10000?"] //查找三个数字或三个以上个数字,有三个匹配100,1000和10000里的1000

    // n$   匹配任何结尾为 n 的字符串。
    console.log(/d!$/.exec("Hello World!"));
    // 结果:["d!", index: 10, input: "Hello World!"]

    // ^n   匹配任何开头为 n 的字符串。
    console.log(/^He/.exec("Hello World!"));
    // 结果:["He", index: 0, input: "Hello World!"]

    // ?=n  匹配任何其后紧接指定字符串 n 的字符串。
    console.log(/llo(?= Wor)/.exec("Hello World!"));
    // 结果:["llo", index: 2, input: "Hello World!"]

    // ?!n  匹配任何其后没有紧接指定字符串 n 的字符串。
    console.log(/llo(!= Wor)/.exec("Hello World!"));
    // 结果:null

    // RegExp 对象方法
    // exec 检索字符串中指定的值。返回找到的值,并确定其位置。   
    console.log(/[1-9]/.exec("a1b2"));
    // 结果:["1", index: 1, input: "a1b2"]

    // test 检索字符串中指定的值。返回 true 或 false。
    console.log(/[1-9]/.test("a1b2"));
    // 结果:true

    // 支持正则表达式的 String 对象的方法
    // search   检索与正则表达式相匹配的值。
    console.log("Hello World!".search(/d!$/));
    // 结果:10

    // match    找到一个或多个正则表达式的匹配。
    console.log("Hello World!".match(/d!$/));
    // 结果:["d!", index: 10, input: "Hello World!"]

    // replace  替换与正则表达式匹配的子串。
    console.log("Hello World!".replace(/d!$/, "kkk"));

    // split    把字符串分割为字符串数组。
    console.log("Hello World! Football!".split(/o+/));
    // 结果:["Hell", " W", "rld! F", "tball!"]
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容