正则表达式模式匹配的String方法

在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,以下是对一些方法使用的总结。

String对象中支持正则表达式有4种方法,分别是:search、replace、match、split

str.search(regexp)

定义:search()方法将在字符串str中检索与表达式regexp相匹配的字串,并且返回第一个匹配字串的第一个字符的位置。如果没有找到任何匹配的字串,则返回-1。

例如:

var str = "Javascript";
str.search(/script/); // 返回 script 中s的位置为 4
str.search(/j/i); // 设置正则表达是标识i:忽略大小写,则匹配到J,返回位置0 

但是,search()方法不支持全局搜索,因为会忽略正则表达式参数的标识g,并且也忽略了regexp的lastIndex属性,总是从字符串的开始位置进行检索,所以它会总是返回str的第一个匹配的位置。

例如:

var str = "javascript is cool";
str.search(/s/g); // 返回 javascript 中的s位置4,不会继续检索s

str.replace(regexp, replacement)

定义:replace()方法是执行查找并替换的操作。它将正则表达式regexp匹配到的字串,然后用replacement的字符串替换掉字串,如果有全局标识g,则替换全部匹配的字串,否则只替换第一个匹配字串。

replace方法应该是比较常用的一个方法,在字符串替换操作中非常有用的。例如:

1、简单替换

var str = "javascript";
str.replace(/javascript/,'JavaScript'); // 将字符串javascript替换为JavaScript 

2、全局替换

// 使用全局表示g进行全局替换
var str = "javascript";
str.replace(/a/g, 'b'); // 将所有的字母a替换为字母b,返回 jbvbscript 

3、使用replacement中的特殊字符替换,在replacement中$字符有特殊的意义,具体说明如下表格:

字符 替换文本
$1、$2、...、$99 与regexp中的第1个到99 个子表达式相匹配的文本
$& 与regexp相匹配的字串
$` 位于匹配子串左侧的文本
$' 位于匹配子串右侧的文本
$$ 直接量符号

来看下例子:

//1、用子表达式替换:$1、$2等
var str = "javascript";
str.replace(/(java)(script)/,'$2$1');
// 表达式中()就是一个子表达式,$1对应是第一个表达式的内容,即java,$2为script,所以替换结果为:scriptjava
//2、$& 为正值表达式匹配的字串
var str = "javascript";
str.replace(/java/,'$&-');
// 正则表达式通过直接量java来匹配,匹配结果为java,则 $&的值为java,然后用字符串$&-来替换匹配的字串,结果为java-script
// 3、 $` $' $$
var str = "javascript";
str.replace(/ava/,"$`"); // $`为匹配子串ava的左侧文本,则为j,则替换后ava的结果为:jjscript
str.replace(/ava/,"$'"); // $'为匹配子串ava的右侧文本,则为script,则替换ava的结果为:jscriptscript
str.replace(/ava/,"$$"); // $$为直接量符号,即插入一个$符号,替换结果为:j$script

4、使用replacement作为函数替换

replace的参数replacement可以是函数而不是字符串,每个匹配都会调用该函数,它返回的字符串将作为替换的文本使用。该函数的第一个参数是整个匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,可以有0个或多个参数。接下来的参数是一个整数,声明了匹配在str中出现的位置。最后的参数是str自身。

来看个例子:

// match 为匹配整个字符串,即:'abc12345#$*%'
// p1 为第一个子表达式,([^\d]*),匹配0个或多个非数字的字符,即:abc
// p2 为第二个子表达式,(\d*),匹配0个或多个的数字,即:12345
// p3 为第三个子表达式,([^\w]*),匹配0个或匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',即 #$*%
// offset 为模式匹配出现的位置,从第一个字符已经匹配成功,则位置为0
// string为字符串本身,即 abc12345#$*%
function replacer(match, p1, p2, p3, offset, string) {
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
// 替换结果为:abc - 12345 - #$*%

str.match(regexp)

定义:match()方法是最常用的String正则表达式方法。它唯一的参数就是一个正则表达式或者通过RegExp()构造函数来创建正则表达式,返回值是包含了匹配结果的数组。

match()方法中的regexp正则表达式一般又分为两种情况:有设置全局标志g和没有设置全局标志g

1、有设置全局标志

如果设置了全局标志g,则返回的数组包含的就是出现在字符串的所有匹配结果,例如:

// 全局匹配
var str = "1 plus 2 equals 3";
str.match(/\d/g); // 匹配字符串中出现的所有数字,并返回一个数组: [1,2,3]

2、没有设置全局标志

如果没有设置全局标志,则就不是全局性的检索,只是检索第一个匹配。这种情况下,match()方法匹配的结果也是返回一个数组,数组的第一个元素就是匹配的字符串,而余下的元素则是正则表达式中用括号括起来的子表达式。来看个例子:

// 非全局匹配
var str = "visit my blog at http://www.example.com";
str.match(/(\w+):\/\/([\w.]+)/); // 返回结果:["http://www.example.com", "http", "www.example.com"]
// 正则表达式匹配的结果为:http://www.example.com
// 第一个子表达式 (\w+)匹配结果:http
// 第二个子表达式 ([\w.])匹配结果: www.example.com

str.split(delimiter, limit)

定义:split()方法可以把调用它的字符串分解为一个字串数组,使用的分隔符是它的参数。

参数:

delimiter:字符串或者正则表达式,从该参数指定的地方分割字符串。

limit:指定返回数组的最大长度,如果没有设置该参数,则整个字符串都会被分割。

例如:

//1、 只传一个参数,默认分割整个字符串
var str ="a,b,c,d,e";
str.split(','); // 返回分割的字符串数组:["a", "b", "c", "d", "e"]
//2、传入两个参数
var str ="a,b,c,d,e";
str.split(',',3); //指定限定长度,则返回对应的数组:["a", "b", "c"]
//3、使用正则表达式匹配,不包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/\d+/); //通过匹配数字进行分割字符串,但不包含分割的字符串,则返回的结果为:["aa","bb","cc","dd"];
//4、使用正则表达式匹配,包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/(\d+)/); //通过匹配数字进行分割字符串,且分割的字符串是包含在子表达式中,则返回的结果为:["aa", "44", "bb", "55", "cc", "66", "dd"]

关于正则表达式模式匹配的String方法的相关知识,小编就给大家介绍到这里,希望对大家有所帮助!

(0)

相关推荐

  • js正则表达式学习笔记

    正则表达式:对字符串中的信息实现查找.替换和提取操作.(不支持注释和空白,必须写在一行内) 正则表达式的创建:包含在一对斜杠之间的字符(直接量语法) 例如: var pattern = /s$/; // 创建一个正则来匹配所有以字母s结尾的字符串,并赋值给pattern 一 .字符类 将直接量字符单独放进方括号内就组成了字符类. 一个字符类可以匹配它所包含的任意字符. 正则表达式的字符类: [...]      方括号内的任意字符 [^...]    不在方括号内的任意字符 .         

  • JavaScript 通过模式匹配实现重载

    正好infinte同学提出"更优雅的兼容"其实也和这个问题有一定的关联(我们后面会看到) 在youa的脚本库中Function的Helper中,添加支持重载的模式匹配 复制代码 代码如下: /** * 函数参数重载方法 overload,对函数参数进行模式匹配.默认的dispatcher支持*和...以及?,"*"表示一个任意类型的参数,"..."表示多个任意类型的参数,"?"一般用在",?..."表示0个

  • JavaScript学习笔记整理_用于模式匹配的String方法

    用于模式匹配的String方法: String支持4种使用正则表达式的方法: seach()用于检索,参数是一个正则表达式,返回第一个与之匹配的子串的位置,找不到则返回-1,如果参数不是正则表达式,则首先会通过RexExp构造函数将它转换成正则表达式,seach()方法不支持全局搜索,它忽略修饰符g: replace()用于检索与替换操作,第一个参数是一个正则表达式,第二个参数是要进行替换的字符串.它对调用该方法的字符串检索,按照模式匹配子串替换成第二个参数,若包含修饰符g则全文匹配.若第一个参

  • js 正则表达式学习笔记之匹配字符串

    今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享. 关于匹配字符串问题,有很多种类型,今天讨论 js 代码里的字符串匹配.(因为我想学完之后写个语法高亮练手,所以用js代码当作例子) 复制代码 代码如下: var str1 = "我是字符串1哦,快把我取走", str2 = "我是字符串2哦,快把我取走"; 比如这样一个字符串,匹配起来很简单 /"[^"]*"/g 即可.   PS: 白色截图是 chrome 34 控制台中

  • 正则表达式模式匹配的String方法

    在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace.match.search等方法,以下是对一些方法使用的总结. String对象中支持正则表达式有4种方法,分别是:search.replace.match.split str.search(regexp) 定义:search()方法将在字符串str中检索与表达式regexp相匹配的字串,并且返回第一个匹配字串的第一个字符的位置.如果没有找到任何匹配的字串,则返回-1.

  • 正则表达式模式匹配字符串基础知识

     介绍 在实际项目中有个功能的实现需要解析一些特定模式的字符串.而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是: 逻辑上很容易出错 很容易漏掉对一些边界条件的检查 代码复杂难以理解.维护 性能差 看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目.而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的. 在这种情况下,基本没办法还沿着这条老路走下去,自

  • 正则表达式截取字符串的方法技巧

    有这么一段字符串: [数字]字符串 结果 取  a=数字 b=字符串 截取方法1: int a = Convert.ToInt32(txt1.Text.Trim().Replace('[', ']').Split(']')[1]); string b = txt1.Text.Trim().Replace('[', ']').Split(']')[2]; 截取方法2: string str = "[数字]字符串"; Regex reg = new Regex(@" ([^]+)

  • SQL Server中利用正则表达式替换字符串的方法

    建立正则替换函数,利用了OLE对象,以下是函数代码: --如果存在则删除原有函数 IF OBJECT_ID(N'dbo.RegexReplace') IS NOT NULL DROP FUNCTION dbo.RegexReplace GO --开始创建正则替换函数 CREATE FUNCTION dbo.RegexReplace ( @string VARCHAR(MAX), --被替换的字符串 @pattern VARCHAR(255), --替换模板 @replacestr VARCHAR

  • Java正则表达式提取字符的方法实例

    正好遇到一个需求需要将字符串中特定的字符全部提取出来,这个如果是按常规的字符串处理的话非常的繁琐.于是想到用正则表达式来完成.项目需求是这样的:需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6 实现方法: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test { public static void main(String[] args) { String s

  • java使用正则表达式判断手机号的方法示例

    本文实例讲述了java使用正则表达式判断手机号的方法.分享给大家供大家参考,具体如下: 要更加准确的匹配手机号码只匹配11位数字是不够的,比如说就没有以144开始的号码段, 故先要整清楚现在已经开放了多少个号码段,国家号码段分配如下: 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156.185.186 电信:133.153.180.189.(1349卫通) 那么现在就可以正则匹

  • ES6学习笔记之正则表达式和字符串正则方法分析

    本文实例讲述了ES6正则表达式和字符串正则方法.分享给大家供大家参考,具体如下: RegExp构造函数 在ES5中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new RegExp('xyz', 'i'); // 等价于 var regex = /xyz/i; 第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝. var regex = new RegExp(/xyz/i);

  • c++使用正则表达式提取关键字的方法

    下面看下c++通过正则表达式提取关键字,代码如下所示: string text = "岳云鹏的对象叫铁锤"; regex pattern("(.*)的对象叫(.*)"); smatch results; if (regex_match(text, results, pattern)) { for (auto it = results.begin(); it != results.end(); ++it) cout << *it << endl

  • 梳理总结JavaScript的23个String方法

    目录 简单介绍 1.charAt() 2.charCodeAt() 3.codePointAt() 4.indexOf() 5.lastIndexOf() 6.startsWith() 7.endsWith() 8.includes() 9.concat() 10.fromCharCode() 11.fromCodePoint() 12.split() 13.slice() 14.substring() 15.substr() 16.match() 17.replace() 18.search(

随机推荐