关于javascript:JS中的正则表达式

7次阅读

共计 3274 个字符,预计需要花费 9 分钟才能阅读完成。

1.RegExp 类型
ECMAScript 通过 RegExp 类型反对正则表达式。

let expression = /pattern/flags;
pattern(模式)是任何正则表达式,正则表达式能够带零个或多个 flags。

常见 修饰符(标记)

修饰符 形容
g 全局匹配查找所有匹配项
i 疏忽大小写
m 使边界字符 ^ 和 $ 匹配每一行的结尾和结尾,记住是多行,而不是整个字符串的结尾和结尾。
y 粘附模式,示意只匹配以 lastIndex 为结尾的字符串。(主动开启全局模式)
s 默认状况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中蕴含换行符 \n。
例子:

// 匹配所有以 ”at” 结尾的三字符组合,疏忽大小写
let pattern = /.at/gi;
注:匹配元字符须要本义

1.1RegExp 构造函数
正则表达式 也能够应用 RegExp 构造函数来创立,它接管两个参数:模式字符串和(可选的)标记字符串。

let pattern1 = /[bc]at/i;

// 跟 pattern1 一样,只不过是用构造函数创立的
let pattern2 = new RegExp(“[bc]at”, “i”);

留神:因为 RegExp 的模式参数是字符串,所以在某些状况下须要二次本义。具体做法是对字面量中的每个反斜杠后面再加一个反斜杠

1.2 实例属性
每个 RegExp 都有用于模式信息的实例属性。

属性 形容
global、ignorCase、sticky、unicode、multiline、dotAll 布尔值。别离判断是否设置了 g、i、y、u、m、s 标记
lastIndex 示意在源字符串中下一次搜寻的开始地位,始终从 0 开始
source 表达式字面量字符串(去掉开始和结尾斜杠)
flags 标记信息字符串
1.3 实例办法
① exec()
只接管一个参数,即要利用模式的字符串。

如果找到了匹配项,则返回蕴含第一个匹配信息的数组;如果没找到匹配项,则返回 null。
返回的数组尽管是 Array 的实例,但蕴含两个额定的属性:index 和 input。

index:匹配到字符串的起始地位。
input:要查找的字符串

这个数组的第一个元素是匹配整个模式的字符串,其余元素是与表达式中的捕捉组匹配的字符串。如果模式中没有捕捉组,则数组只蕴含一个元素。

let text = “cat,bat”;
let pattern = /([bc])at/i;

let matches = pattern.exec(text);
//[“cat”, “c”, index: 0, input: “cat,bat”, groups: undefined]
console.log(matches[0]); // “cat”
console.log(matches[1]); // “c”
console.log(matches.lastIndex); // 没有应用全局匹配,永远为 0

如果在这个模式上设置了 g 标记,则每次调用 exec()都会在字符串中向前搜寻下一个匹配项,如上面的例子所示:
let text = “cat,bat”;
let pattern = /([bc])at/gi;

let matches = pattern.exec(text);
//[“cat”, “c”, index: 0, input: “cat,bat”, groups: undefined]
console.log(matches.lastIndex); // 3

pattern.exec(text);
//[“bat”, “b”, index: 4, input: “cat,bat”, groups: undefined]
console.log(matches.lastIndex); // 7

pattern.exec(text);
//null
console.log(matches.lastIndex); // 0
注:如果模式设置了粘附标记 y,则每次调用 exec()就只会在 lastIndex 的地位上寻找匹配项。(主动开启全局模式)

如果匹配中途完结,能够通过调整 lastIndex 的属性值复原匹配。

② test()
接管一个字符串参数。如果输出的文本与模式匹配(齐全匹配),则参数返回 true,否则返回 false。

当咱们只关怀是否匹配时能够应用 test()。

③ 其余办法
toLocaleString() 和 toString():返回其字面量的字符串示意。

let r = /([bc])at/iy;
console.log(r.toString()); // “/([bc])at/iy”

valueOf():返回正则表达式自身

2.4 构造函数属性(动态属性)
RegExp 也有几个动态属性 但不罕用。略

2. 字符串匹配
1.match()
实质与 RegExp 的 exec() 办法雷同。办法接管一个参数:正则表达式对象,或表达式字符串

let text = “cat,bat”;
let pattern = /(.)at/i;

let matches = text.match(pattern)
//let matches = pattern.exec(text); 等价

//[“cat”, “c”, index: 0, input: “cat,bat”, groups: undefined]
console.log(matches[0]); // “cat”
console.log(matches[1]); // “c”
console.log(matches.lastIndex); // 没有应用全局匹配,永远为 0

2.search()
查找模式,办法接管一个参数:正则表达式对象,或表达式字符串。返回模式第一个匹配的地位索引,如果没找到则返回 -1。

let text = “cat, bat, sat, fat”;
let pos = text.search(/at/);
console.log(pos); // 1

3.replace()
用于替换字符串,办法接管两个参数,第一个参数为 RegExp 对象或字符串、第二个参数为字符串或函数。

第一个参数为字符串则只会替换第一个字符串,如果全副替换,正则表达式必须带全局标记。

第二个参数是字符串时有几个特殊字符,可用来示意匹配到的值
$n:n 为 0 -9,$1 示意第一个捕捉组的字符串

let text = “bat, cat, fat, tat”;
let pattern = /(.)at/g;

let result = text.replace(pattern,”$1$1″); //$1 示意分组 1 也就是 at 后面的字符
console.log(result); //”bb, cc, ff, tt”

第二个参数是函数,函数会接管三个参数:匹配的整个字符串、匹配索引、整个字符串。(多个捕捉组会传屡次)。
函数应该返回一个字符串,示意替换内容。

function htmlEscape(text) {

return text.replace(/[<>"&]/g,
    function(match, pos, originalText) {switch(match) {
            case "<":
                return "&lt;";
            case ">":
                return "&gt;";
            case "&":
                return "&amp;";
            case "\"":
                return "&quot;";
        }
    });

}
console.log(htmlEscape(“<p class=\”greeting\”>Hello world!</p>”));
// “<p class=”greeting”>Hello world!</p>”

4.split()
用于将字符串宰割为数组,第一个参数能够是 RegExp 对象或字符串,第二个可选参数用于指定数组最大大小。

let colorText = “red,blue,green,yellow”;
let colors1 = colorText.split(“,”);
// [“red”, “blue”, “green”, “yellow”]
let colors2 = colorText.split(“,”, 2);
// [“red”, “blue”]
let colors3 = colorText.split(/1+/);
// [“”, “,”, “,”, “,”, “”] 如果分隔符在结尾和结尾呈现,数组的前后就会呈现空字符串元素


  1. , ↩
正文完
 0