JavaScript正则表达式----RegExp类型, 代码说明简单易懂

RegExp

正则表达式定义

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。匹配原则: 贪婪匹配
直接量语法
/pattern(匹配规则)/attributes(属性)
创建 RegExp 对象的语法:
new RegExp(pattern(规则), attributes(属性, 修饰符));

var reg = /abc/m;
var reg1 = new RegExp("abc", "m");
var reg2 = new RegExp(reg);//这里的参数也可以直接写创建好的正则表达式

使用正则表达式分两种:
字符串中的方法和正则中的方法.

  1. reg.test(str);返回结果true和false
  2. str.match(reg);返回匹配的结果

正则表达式属性

即(属性可以并列)

var reg1 = /abc/i;
var reg2 = /abc/m;
var reg3 = /abc/g;
修饰符 描述
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

正则表达式规则(方括号)

我们来以代码阐述问题

var reg = /[1234567890][1234567890][1234567890]/g;
var str = "as123ascadfsdfgfdgf";

上述代码中的正则表达式代表我们要匹配3个值的字符串, 每个值分别为3个方括号里的值中的一个, 即0-9. 在下文的学习中我们更简单的方法例如将[0123456789]改成[0-9]也是可以的.

方法汇总:

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。(注意在方括号和不在方括号时^的区别)
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。(匹配一个字符, 即匹配red或blue或green)

正则表达式元字符

元字符是拥有特殊含义的字符, 在表达式中也可以选择元字符.

例如:

\w === [0-9A-z_];
\W === [^\w];

用法:

var reg = /\wcd2/;
var str = "acd2";

元字符汇总

元字符 描述
. 查找单个字符,除了换行和行结束符。=== [^\r\n]
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。(包括空格符, 制表符, 回车符, 换行符, 垂直换行符, 换页符, 即\s === [\t\n\r\v\f空格])
\S 查找非空白字符。
\b 匹配单词边界。例如:var str = "abc cde fgh", 这就是6个单词边界. 用法: var reg = /\bc/g;, 即表达匹配在单词边界的c
\B 匹配非单词边界。
\0 查找 NUL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

正则表达式量词

用法:

var reg = /\w+/g;
var str = "abc";

注意:

var reg = /\w*/g;
var str = "abc";

如果调用str.match(reg);会返回给我们两个匹配结果, 第一个字符串为abc, 第二个为空字符串, 即"中间没空格". 因为n*可以匹配空

我们在看一个例子:

var reg = /\d*/g;
var str = "abc";

结果为:


这里写图片描述

原因: 匹配4次光标

量词汇总:

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。
n* 匹配任何包含零个或多个 n 的字符串。
n? 匹配任何包含零个或一个 n 的字符串。
n{X} 匹配包含 X 个 n 的序列的字符串。
n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
n{X,} 匹配包含至少 X 个 n 的序列的字符串。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

来一道例题:
检测一个字符串收尾是否含有数字

var reg = /^\d|\d$/g;

若是想要检测收尾都含有数字

var reg = /^\d[\s\S]*\d$/g;

RegExp 对象属性

属性 描述
global RegExp 对象是否具有标志 g。
ignoreCase RegExp 对象是否具有标志 i。
lastIndex 一个整数,标示开始下一次匹配的字符位置。
multiline RegExp 对象是否具有标志 m。
source 正则表达式的内容。

RegExp 对象方法

方法 描述
compile 编译正则表达式。
exec 检索字符串中指定的值。返回找到的值,并确定其位置。位置在exec返回之中的index属性中(需要用console.log()打印出来), 控制台直接输出看不到index属性 , 每一次匹配结束的位置就是lastindex属性开始的位置
test 检索字符串中指定的值。返回 true 或 false。

支持正则表达式的 String 对象的方法

方法 描述
search 检索与正则表达式相匹配的值。
match 找到一个或多个正则表达式的匹配。
replace 替换与正则表达式匹配的子串。
split 把字符串分割为字符串数组。

replace用法:

var str1 = "abcdasedf";
var str2 = "abcdasedf";
var reg = /a/g;
str1.replace("a", "b");
str2.replace(reg, "b");

str1中第一个a替换成b**
str2中所有a替换都成b


知识点小例题

一.

var str = "aaaa";
var reg = /(a)\1\1\1/g;
var reg1 = /(\w)\1(\w)\2/g;

上述代码中\1会引用( )中的内容, 当然括号中的内容也可以换成\w, \2会引用第二个( )中的内容, 在exec方法中, 若是调用console.log( )方法还会把\1\2的内容给输出出来.


二.

var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(str.replace(reg, "$2$2$1$1"));

$1, $2分别引用的是匹配到的第一个括号内的值和第二个值

console.log(str.replace(reg, function($, $1, $2) {
    return $2 + $2 + $1 + $1;
}))

当然也可以采用函数作为第二参数


三.
例: 将the-first-name变成theFirstName

var reg = /-(\w)/g;
var str = "the-first-name";
console.log(str.replace(reg, function($, $1) {
    return $1.toUpperCase();
})

四.

var str = "abaaaa";
var reg1 = /a(?=b)/g;
var reg2 = /a(?!b)/g;

第一个只会返回1个a


五.
'?'会取消贪婪匹配

var str = "aaaaaa";
var reg = /a?/g;

返回只有一个a


六.
字符串去重

var str = "aaaabbbbcccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg, "$1"));

七.
最后一道例题我们来一道最坑爹的2012年百度笔试题
例: 给你一个类似于1000000这样的一个数字, 把它转化成科学计数的形式, 即1,000,000

var str = "1000000";
var reg = /(?=(\B)(\d{3})+$)/g;
str.replace(reg, ".");

从后往前查, 找到3个数(一到多个), 是不是后面为3个数的占空位并且以这个结尾(非单词边界)


八.
字符串中还有两个方法为, toUpperCase( )和toLowerCase( )变换大小写

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容