\s:[\t\v\n\r\f],表示空白符,包括空格,水平制表符(\t),垂直制表符(\v),换行符(\n),回车符(\r),换页符(\f),记忆方式 space character
\S:[^\t\v\n\r\f],表示非空白符
\w:[0-9a-zA-Z],表示数字大小写字母和下划线,记忆方式 word
\W:[^0-9a-zA-Z],表示非单词字符
标志字符
g : 全局搜索 记忆方式global
i :不区分大小写 记忆方式 ignore
m :多行搜索
在 js 中的使用
支持正则的 String 对象的方法
search
search 接受一个正则作为参数,如果参入的参数不是正则会隐式的使用 new RegExp(obj)将其转换成一个正则,返回匹配到子串的起始位置,匹配不到返回-1
match
接受参数和上面的方法一致。返回值是依赖传入的正则是否包含 g ,如果没有 g 标识,那么 match 方法对 string 做一次匹配,如果没有找到任何匹配的文本时,match 会返回 null ,否则,会返回一个数组,数组第 0 个元素包含匹配到的文本,其余元素放的是正则捕获的文本,数组还包含两个对象,index 表示匹配文本在字符串中的位置,input 表示被解析的原始字符串。如果有 g 标识,则返回一个数组,包含每一次的匹配结果
var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \d+(\.\d)*)/i;
var found = str.match(re);
console.log(found);
// (3) ["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1", index: 22, input: "For more information, see Chapter 3.4.5.1"]
// 0:"see Chapter 3.4.5.1"
// 1:"Chapter 3.4.5.1"
// 2:".1"
// index:22
// input:"For more information, see Chapter 3.4.5.1"
// length:3
// proto:Array(0)
title: js 的正则表达式 date: 2017-08-10
正则表达式
一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查找并编辑特定的信息(替换)。
核心是 匹配,匹配位置或者匹配字符
先简单的介绍一下语法
基本元字符
.
: 匹配除了换行符之外的任何单个字符\
: 在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前\的'b'通常匹配小写'b',无论它们出现在哪里。如果加了'\',这个字符变成了一个特殊意义的字符,反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式/a*/
代表会匹配 0 个或者多个 a。相反,模式/a\*/
将 '*' 的特殊性移除,从而可以匹配像"a*"
这样的字符串。|
: 逻辑或操作符[]
:定义一个字符集合,匹配字符集合中的一个字符,在字符集合里面像.
,\
这些字符都表示其本身[^]
:对上面一个集合取非-
:定义一个区间,例如[A-Z]
,其首尾字符在 ASCII 字符集里面数量元字符
{m,n}
:匹配前面一个字符至少 m 次至多 n 次重复,还有{m}
表示匹配 m 次,{m,}
表示至少 m 次+
: 匹配前面一个表达式一次或者多次,相当于{1,}
,记忆方式追加(+),起码得有一次*
: 匹配前面一个表达式零次或者多次,相当于{0,}
,记忆方式乘法(*),可以一次都没有?
: 单独使用匹配前面一个表达式零次或者一次,相当于{0,1}
,记忆方式,有吗?,有(1)或者没有(1),如果跟在任何量词*
,+
,?
,{}
后面的时候将会使量词变为非贪婪模式(尽量匹配少的字符),默认是使用贪婪模式。比如对 "123abc" 应用/\d+/
将会返回 "123",如果使用/\d+?/
,那么就只会匹配到 "1"。位置元字符
^
: 单独使用匹配表达式的开始\b
:匹配单词边界\B
:匹配非单词边界(?=p)
:匹配 p 前面的位置(?!p)
:匹配不是 p 前面的位置特殊元字符
\d
:[0-9]
,表示一位数字,记忆方式 digit\D
:[^0-9]
,表示一位非数字\s
:[\t\v\n\r\f]
,表示空白符,包括空格,水平制表符(\t
),垂直制表符(\v
),换行符(\n
),回车符(\r
),换页符(\f
),记忆方式 space character\S
:[^\t\v\n\r\f]
,表示非空白符\w
:[0-9a-zA-Z]
,表示数字大小写字母和下划线,记忆方式 word\W
:[^0-9a-zA-Z]
,表示非单词字符标志字符
g
: 全局搜索 记忆方式globali
:不区分大小写 记忆方式 ignorem
:多行搜索在 js 中的使用
支持正则的 String 对象的方法
console.log(found);
// (3) ["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1", index: 22, input: "For more information, see Chapter 3.4.5.1"] // 0:"see Chapter 3.4.5.1" // 1:"Chapter 3.4.5.1" // 2:".1" // index:22 // input:"For more information, see Chapter 3.4.5.1" // length:3 // proto:Array(0)
// 'see Chapter 3.4.5.1' 是整个匹配。 // 'Chapter 3.4.5.1' 被'(chapter \d+(.\d)*)'捕获。 // '.1' 是被'(.\d)'捕获的最后一个值。 // 'index' 属性(22) 是整个匹配从零开始的索引。 // 'input' 属性是被解析的原始字符串。
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; var regexp = /[A-E]/gi; var matches_array = str.match(regexp);
console.log(matches_array); // ['A', 'B', 'C', 'D', 'E', 'a', 'b', 'c', 'd', 'e']
var re = /(\w+)\s(\w+)/; var str = "John Smith"; var newstr = str.replace(re, "$2, $1"); // Smith, John console.log(newstr);
function replacer(match, p1, p2, p3, offset, string) { // p1 is nondigits, p2 digits, and p3 non-alphanumerics return [p1, p2, p3].join(' - '); } var newString = 'abc12345#$%'.replace(/([^\d])(\d)([^\w])/, replacer); // newString abc - 12345 - #$*%
var myString = "Hello 1 word. Sentence number 2."; var splits = myString.split(/\d/);
console.log(splits); // [ "Hello ", " word. Sentence number ", "." ]
splits = myString.split(/(\d)/); console.log(splits); // [ "Hello ", "1", " word. Sentence number ", "2", "." ]
var string = "2017.06.27"; var regex2 = /\b(\d+)\b/g; console.log( regex2.exec(string) ); console.log( regex2.lastIndex); console.log( regex2.exec(string) ); console.log( regex2.lastIndex); console.log( regex2.exec(string) ); console.log( regex2.lastIndex); console.log( regex2.exec(string) ); console.log( regex2.lastIndex); // => ["2017", "2017", index: 0, input: "2017.06.27"] // => 4 // => ["06", "06", index: 5, input: "2017.06.27"] // => 7 // => ["27", "27", index: 8, input: "2017.06.27"] // => 10 // => null // => 0
var string = "2017.06.27"; var regex2 = /\b(\d+)\b/g; var result; while ( result = regex2.exec(string) ) { console.log( result, regex2.lastIndex ); } // => ["2017", "2017", index: 0, input: "2017.06.27"] 4 // => ["06", "06", index: 5, input: "2017.06.27"] 7 // => ["27", "27", index: 8, input: "2017.06.27"] 10
var regex = /ab{2,5}c/g; var string = "abc abbc abbbc abbbbc abbbbbc abbbbbbc"; console.log( string.match(regex) ); // ["abbc", "abbbc", "abbbbc", "abbbbbc"]
var regex = /\d{2,5}/g; var string = "123 1234 12345 123456"; console.log( string.match(regex) ); // ["123", "1234", "12345", "12345"]
var regex = /\d{2,5}?/g; var string = "123 1234 12345 123456"; console.log( string.match(regex) ); // ["12", "12", "34", "12", "34", "12", "34", "56"]
var regex = /a[123]b/g; var string = "a0b a1b a2b a3b a4b"; console.log( string.match(regex) ); // ["a1b", "a2b", "a3b"]
var regex = /good|goodbye/g; var string = "goodbye"; console.log( string.match(regex) ); // ["good"]
I love JavaScript I love Regular Expression
'I love JavaScript'.match(/^I love (JavaScript|Regular Expression)$/) // ["I love JavaScript", "JavaScript", index: 0, input: "I love JavaScript"]
var regex = /(\d{4})-(\d{2})-(\d{2})/; var string = "2017-08-09"; console.log( string.match(regex) ); // => ["2017-08-09", "2017", "08", "09", index: 0, input: "2017-08-09"]
var regex = /(\d{4})-(\d{2})-(\d{2})/; var string = "2017-08-09";
regex.test(string); // 正则操作即可,例如 //regex.exec(string); //string.match(regex);
console.log(RegExp.$1); // "2017" console.log(RegExp.$2); // "08" console.log(RegExp.$3); // "09"
var regex = /(\d{4})-(\d{2})-(\d{2})/; var string = "2017-08-09"; var result = string.replace(regex, "$2/$3/$1"); console.log(result); // "08/09/2017" 等价 var result = string.replace(regex, function() { return RegExp.$2 + "/" + RegExp.$3 + "/" + RegExp.$1; }); console.log(result); // "08/09/2017" 等价 var regex = /(\d{4})-(\d{2})-(\d{2})/; var string = "2017-08-09"; var result = string.replace(regex, function(match, year, month, day) { return month + "/" + day + "/" + year; }); console.log(result); // "08/09/2017"
2017-08-09
2017/08/09
2017.08.09
var regex = /^((\d)(\d(\d)))\1\2\3\4$/; var string = "1231231233"; console.log( regex.test(string) ); // true console.log( RegExp.$1 ); // 123 console.log( RegExp.$2 ); // 1 console.log( RegExp.$3 ); // 23 console.log( RegExp.$4 ); // 3
function dash(str) { return str.replace(/([A-Z])/g, '-$1').toLowerCase(); }
function getParamName(attr) {
let match = RegExp(
[?&]${attr}=([^&]*)
) //分组运算符是为了把结果存到exec函数返回的结果里 .exec(window.location.search) //["?name=jawil", "jawil", index: 0, input: "?name=jawil&age=23"] return match && decodeURIComponent(match[1].replace(/+/g, ' ')) // url中+号表示空格,要替换掉 }console.log(getParamName('name')) // "jawil"
function trim(str) { return str.replace(/(^\s)|(\s$)/g, "") }
function isPrime(num) { return !/^1?$|^(11+?)\1+$/.test(Array(num+1).join('1')) }