js正则表达式

正则表达式中的特殊字符

'^'号

  • 匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
  • 例如,/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。
/^A/.test("an A");   // true
/^A/.test("An E");   // false

'$'号

  • 匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
  • 例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。
/t$/.test("eater");   // false
/t$/.test("eat");     // true

'*'号

  • 匹配前一个表达式0次或多次。等价于 {0,}。
  • 例如,/bo*/会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中将不会匹配任何东西。
"A ghost boooooed".replace(/bo*/,"c"); // "A ghost ced"

'+'号

  • 匹配前面一个表达式1次或者多次。等价于 {1,}。
  • 例如,/a+/匹配了在 "candy" 中的 'a',和在 "caaaaaaandy" 中所有的 'a'。

'?'号

  • 匹配前面一个表达式0次或者1次。等价于 {0,1}。
  • 例如,/e?le?/ 匹配 "angel" 中的 'el',和 "angle" 中的 'le' 以及"oslo' 中的'l'。
  • 如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。例如,对 "123abc" 应用 /\d+/ 将会返回 "123",如果使用 /\d+?/,那么就只会匹配到 "1"。
  • 还可以运用于向前断言,在x(?=y) 和 x(?!y) 中有描述。
/e?le?/.exec("angel");        // ['el']
/e?le?/.exec("angle");        // ['le']
/e?le?/.exec("oslo");         // ['l']

/\d+?/.exec("123abc")         // ['1'] 非贪婪模式 (匹配尽量少的字符) 

'.'小数点

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

'(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' )。

\n(n为正整数)表示第n个捕获括号中的内容

/(foo) (bar) \1 \2/.exec( "foo bar foo bar"); // ["foo bar foo bar", "foo", "bar"]

(?:x) 非捕获括号

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

x(?=y) 正向肯定查找

  • 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。
  • 例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
/Jack(?=Sprat)/.exec("JackSprat");        // ["Jack"]
/Jack(?=Sprat|Frost)/.exec("JackFrost")   // ["Jack"]

x(?!y) 正向否定查找

  • 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。
  • 例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’
/\d+(?!\\.)/.exec("3.141")    // '141'

x|y

  • 匹配‘x’或者‘y’。
  • 例如,/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’

{n}

  • n是一个正整数,匹配前面一个字符n次。
  • 比如,/a{2}/不会匹配“candy”中的'a',但是会匹配“caandy”中所有的a,以及“caaandy”中的前两个'a'。

{n,m}

  • n 和 m 都是正整数。匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略。
  • 例如,/a{1, 3}/ 并不匹配“cndy”中得任意字符,匹配“candy”中得a,匹配“caandy”中得前两个a,也匹配“caaaaaaandy”中得前三个a。注意,当匹配”caaaaaaandy“时,匹配的值是“aaa”,即使原始的字符串中有更多的a。

[xyz]

  • 一个字符集合。匹配方括号的中任意字符。你可以使用破折号(-)来指定一个字符范围。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转意,不过转意也是起作用的。
  • 例如,[abcd] 和[a-d]是一样的。他们都匹配"brisket"中得‘b’,也都匹配“city”中的‘c’。/[a-z.]+/ 和/[\w.]+/都匹配“test.i.ng”中得所有字符。

[^xyz]

  • 一个反向字符集。匹配不包含在方括号内的任何字符
  • 例如,[^abc] 和 [^a-c] 是一样的。他们匹配"brisket"中得‘r’,也匹配“chop”中的‘h’。

\b

  • 匹配一个词的边界。

\B

  • 匹配一个非单词边界。

\d

  • 匹配一个数字,等价于[0-9]。

\D

  • 匹配一个非数字,等价于[^0-9]。

\s

  • 匹配一个空白符 包括空格、制表符、换页符和换行符。

\S

  • 匹配一个非空白字符。

\w

  • 匹配一个单字字符(字母、数字或者下划线)。等价于[A-Za-z0-9_]。

\W

  • 匹配一个非单字字符。等价于[^A-Za-z0-9_]。

正则表达式方法

exec()

regexObj.exec(str)
  • 参数
    • str
      • 要用正则表达式匹配的字符串。
  • 返回值
    • 如果成功匹配,exec 方法返回一个数组,并且更新正则表达式对象的属性(lastIndex)。返回的数组包括匹配的字符串作为第一个元素,紧接着一个元素对应一个成功匹配被捕获的字符串的捕获括号

    • 如果匹配失败,exec 方法将返回 null。

var re = /quick\s(brown).+?(jumps)/ig;
var result = re.exec('The Quick Brown Fox Jumps Over The Lazy Dog');

result{
    0: "Quick Brown Fox Jumps",
    1: "Brown",
    2: "Jumps",
    index: 4,
    input: "The Quick Brown Fox Jumps Over The Lazy Dog",
    length: 3
}

re{
    global: true,
    ignoreCase: true,
    lastIndex: 25,
    multiline: false,
    source: "quick\s(brown).+?(jumps)"
}

test()

regexObj.test(str)

执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。

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

推荐阅读更多精彩内容