查看原文
其他

JavaScript 正则表达式(RegExp)实用指南 (二)【译】

lamyoung 白玉无冰 2022-06-10

快速实践指南。用示例理解正则表达式。


在 JavaScript 正则表达式(RegExp)实用指南(一)  介绍了正则表达式的含义,创建方法和测试方法,接下来我们来看下正则表达式中的特殊字符等。


简单的正则表达式模式

这是最基本的模式,只需将文字文本与测试字符串匹配即可。例如:

var regex = /hello/;
console.log(regex.test('hello world'));
// true

特殊字符

到目前为止,我们已经创建了简单的正则表达式模式。现在,让我们在处理更复杂的情况时充分利用正则表达式的全部功能。

例如,我们在一堆邮箱地址中,我们要排除qq邮箱。那是特殊字符起作用的地方。为了完全理解正则表达式,你必须记住一些特殊的符号和字符。

标志

正则表达式具有五个可选的标志或修饰符。让我们讨论两个最重要的标志:

  • g — 常用于执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部)

  • i — 不区分大小写搜索。

还可以在单个正则表达式中用多个标志。他们的顺序对结果没有任何影响。

让我们看一些代码示例:

正则表达式字面量 — 语法 /pattern/flags
var regexGlobal = /abc/g;
console.log(regexGlobal.test('abc abc'));
// 它将匹配所有的'abc',在第一次匹配后不会返回
var regexInsensitive = /abc/i;
console.log(regexInsensitive.test('Abc'));
// returns true, 因为忽略大小写
正则表达式构造函数 — 语法 new RegExp('pattern', 'flags')
var regexGlobal = new RegExp('abc','g')
console.log(regexGlobal.test('abc abc'));
// 它将匹配所有的'abc',在第一次匹配后不会返回
var regexInsensitive = new RegExp('abc','i')
console.log(regexInsensitive.test('Abc'));
// returns true, 因为忽略大小写

字符集:

[xyz] — 字符集是在一个位置匹配不同字符的一种方法,它可以匹配括号内出现的字符中字符串中的任何一个字符。例如:

var regex = /[bt]ear/;
console.log(regex.test('tear'));
// returns true
console.log(regex.test('bear'));
// return true
console.log(regex.test('fear'));
// return false

[^xyz] — ^用在一个方括号的开头的时候, 它表示这个字符集是否定的,它可以匹配除了括号内出现的字符中字符串中的任何一个字符。例如:

var regex = /[^bt]ear/;
console.log(regex.test('tear'));
// returns false
console.log(regex.test('bear'));
// return false
console.log(regex.test('fear'));
// return true

[a-z] — 如果我们想将一个字母的所有字母都匹配在一个位置,我们可以将所有字母写在方括号内,但是有一种更简单的方法,那就是范围。例如:[a-h]将匹配从a到h的所有字母,[0-9]将匹配从a到h的所有数字,[A-Z]将匹配所有大写字母。

var regex = /[a-z]ear/;
console.log(regex.test('fear'));
// returns true
console.log(regex.test('tear'));
// returns true

元字符 — 元字符是具有特殊含义的字符。一共有很多元字符,但我将在这里介绍最重要的字符。

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

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

  • \s — 匹配一个空白字符,包括空格、制表符、换页符和换行符。

  • \t — 匹配一个水平制表符 (U+0009)。

  • \b — 匹配单词的开头或结尾。也称为字边界。

  • . — (小数点)默认匹配除换行符之外的任何单个字符。

  • \D — 匹配一个非数字字符。等价于[^0-9]

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

  • \S — 匹配一个非空白字符。

量词 — 量词是在正则表达式中具有特殊含义的符号。

  • + — 匹配前面一个表达式 1 次或者多次。

    var regex = /\d+/;
    console.log(regex.test('8'));
    // true
    console.log(regex.test('88899'));
    // true
    console.log(regex.test('8888845'));
    // true
  • * — 匹配前一个表达式 0 次或多次。

    var regex = /go*d/;
    console.log(regex.test('gd'));
    // true
    console.log(regex.test('god'));
    // true
    console.log(regex.test('good'));
    // true
    console.log(regex.test('goood'));
    // true
  • ? — 匹配前面一个表达式 0 次或者 1 次。

    var regex = /goo?d/;
    console.log(regex.test('god'));
    // true
    console.log(regex.test('good'));
    // true
    console.log(regex.test('goood'));
    // false
  • ^ — 匹配字符串的开头,紧随其后的正则表达式应位于测试字符串的开头。

    var regex = /^g/;
    console.log(regex.test('good'));
    // true
    console.log(regex.test('bad'));
    // false
    console.log(regex.test('tag'));
    // false
  • $ — 匹配字符串的末尾,即在它之前的正则表达式应位于测试字符串的末尾。

    var regex = /.com$/;
    console.log(regex.test('test@testmail.com'));
    // true
    console.log(regex.test('test@testmail'));
    // false
  • {N} — N 是一个正整数,匹配了前面一个字符刚好出现了 N 次。

    var regex = /go{2}d/;
    console.log(regex.test('good'));
    // true
    console.log(regex.test('god'));
    // false
  • {N,} — N 是一个正整数,匹配前一个字符至少出现了 N 次。

    var regex = /go{2,}d/;
    console.log(regex.test('good'));
    // true
    console.log(regex.test('goood'));
    // true
    console.log(regex.test('gooood'));
    // true
  • {N,M} — N 和 M 都是整数。匹配前面的字符至少 N 次,最多 M 次。

    var regex = /go{1,2}d/;
    console.log(regex.test('god'));
    // true
    console.log(regex.test('good'));
    // true
    console.log(regex.test('goood'));
    // false
  • X|Y — 匹配 X 或者 Y

    var regex = /(green|red) apple/;
    console.log(regex.test('green apple'));
    // true
    console.log(regex.test('red apple'));
    // true
    console.log(regex.test('blue apple'));
    // false

如果表达式中包括特殊字符, 例如要匹配 + 或 ., 就必须使用转义符号(\).

var regex = /a+b/; // This won't work
var regex = /a\+b/; // This will work
console.log(regex.test('a+b')); // true

高级一点的用法

(x) — 匹配x并记住匹配。这些称为捕获组。这也用于在正则表达式中创建子表达式。例如 :

var regex = /(foo)bar\1/;
console.log(regex.test('foobarfoo'));
// true
console.log(regex.test('foobar'));
// false

\1 记住并使用括号中第一个子表达式中的匹配项(上面的例子 \1 等同于 foo )。

(?:x) — 匹配x,不记住匹配。这些称为非捕获组。这里的\1将不起作用,它将与字符串 \1匹配。

var regex = /(?:foo)bar\1/;
console.log(regex.test('foobarfoo'));
// false
console.log(regex.test('foobar'));
// false
console.log(regex.test('foobar\1'));
// true

x(?=y) — 匹配 x 仅仅当 x 后面跟着 y 。这种叫做先行断言。

var regex = /Red(?=Apple)/;
console.log(regex.test('RedApple'));
// true

在上面的示例中,仅当Red紧跟Apple时,匹配才会发生。



为你推荐






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存