javascript 中 String 与正则相关的方法
javascript
中 String
原型上有三个与正则相关的方法 search
、replace
、match
;
这三个方法使得我们提取字符串中的某些格式的数据提供了便利。
replace()
定义与用法
replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
语法
stringObj.replace(regexp/substr,replacement)
返回值
一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。
说明
replace 是执行查找并替换的操作,它将在 stringObj 中查找与 regexp 相匹配的子串,并使用 replacement来替换这些子串。如果regexp具有全局标识符,replace将替换所有匹配的子串,否则,它只替换第一个匹配子串。
replacement 可以是字符串,也可以是函数。如果是字符串,那么每个匹配都将由字符串替换。但是replacement中的$具有特殊的含义,如下所示:
字符 | 替换文本 |
---|---|
$1, 2... 2... 2...n | 与 regexp 中的第 1 到第 n 个子表达式相匹配的文本 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$’ | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
如果replacement 是函数,这种情况下,每一个匹配都会调用该函数,它返回的字符串作为替换文本使用。该函数的第一个参数是匹配模式的的字符串(即匹配到的完整字符串),接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
示例
- replacement 中带有$的
var str = '#test1*';
str.replace(/([a-z]+)(\d+)/g, "第一个子串:($1);第二个子串:($2);子串左侧:($`);子串右侧:($');与 regexp 相匹配的子串:($&)")
//"#第一个子串:(test);第二个子串:(1);子串左侧:(#);子串右侧:(*);与 regexp 相匹配的子串:(test1)*"
-
使用命名分组
var str = "2018-05-21" var res = str.replace(/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/, '$<day>/$<month>/$<year>') res = "21/05/2018"
-
replacement 是函数的
var str = '#test1*';
str.replace(/([a-z]+)(\d+)/g,function(){
console.log(arguments)
return "我是替换匹配的"
})
0: "test1" // 正则匹配到的完整字符串
1: "test" // 匹配到的第一子串
2: "1" // 匹配到的第二个子串
3: 1 // 当前完整匹配在原字符串中的位置
4: "#test1*" // 原字符串
match()
定义与用法
match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
语法
stringObject.match(searchvalue)
stringObject.match(regexp)
返回值
存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。若没有匹配,返回null
-
如果 regexp 有标志 g
match() 方法将执行全局检索,找到 stringObject 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 stringObject 中所有的匹配子串,而且也没有 index 属性或 input 属性。
var str = "2018-05-21"; var match = str.match(/\d+/g) // 返回值 0: "2018" 1: "05" 2: "21"
-
如果 regexp 没有标志 g
match() 方法就只能在 stringObject 中执行一次匹配。如果没有找到任何匹配的文本, match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息
var str = "test444"; var match = str.match(/\d+/) // 返回值 0: "444" // 匹配到的字串 groups: undefined index: 4 // 字串的开始索引 input: "test444" // 原字符串
我们注意到上面有个
groups
的字段为undefined
;
这是正则的命名捕获分组(?<name>reg)
var str = "2018-05-21"; var match = str.match(/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/) // 返回值 0: "2018-05-21" 1: "2018" 2: "05" 3: "21" groups: {year: "2018", month: "05", day: "21"} index: 0 input: "2018-05-21"
search()
定义和用法
search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
返回值
stringObject 中第一个与 regexp 相匹配的子串的起始位置。
注释:如果没有找到任何匹配的子串,则返回 -1。
说明
search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。