JavaScript正则表达式API
1. [代码][JavaScript]代码
参考自《Core JavaScript Reference 1.5》
JavaScript正则表达式有两种写法(随便哪种,看个人习惯):
字面常量写法格式 /pattern/[flags],如/^\d{3}$/g
RegExp对象实例化 new RegExp("pattern" [, "flags"]),如new RegExp("\\w+", "m")
flags可以取g(全局匹配)、i(匹配时忽略大小写)、m(可跨多行进行匹配)。
下面提几个JavaScript正则匹配中的特殊字符:
. 匹配除了换行符以外的任意单个字符
\b 匹配单词边界,注意单词边界不仅可以是空格,字符串开头或结尾也是单词边界,所以:
var reg = /\b.n\b/;
reg.test("on"); // true
[\b] 匹配回车,不要把它跟\b混淆
(x) 匹配'x'字符并且记住匹配),即捕获。例如 /(foo)/ 记主 "foo bar" 中的 "foo" ,并且匹配的子字符串"foo",可以通过结果数组以索引方式取得[1],[2]...[n](注意是从1开始),或者从RegExp对象的$1,...,$9
属性取得
(?:x) 非捕获匹配。匹配'x'但不记住这个匹配。
x(?=y) 正向预搜索,匹配'x'仅当'x'后面紧跟'y'。例如 /Jack(?=Sprat|Frost)/ 匹配'Jack'仅当它后面紧跟'Sprat’或者'Frost'。但是'Sprat'和'Frost'不包含在匹配结果中
x(?!y) 也是正向预搜索,匹配'x'仅当'x'后面不紧跟'y'。如 /\d+(?!\.)/匹配一个数字仅当它后面不紧跟小数
点字符,所以 /\d+(?!\.)/.exec("3.1415926") 匹配 "1415926",但是不匹配 "3.1415926"
\f 匹配一个表单换行(form-feed)
\n 匹配换行
\r 匹配一个carriage return
\s 匹配单个空白字符,包括空格、tab、表单换行、\n,等价于[ \f\n\r\t\u00A0\u2028\u2029]
\S 匹配不是空白字符的单个字符,等价于[^ \f\n\r\t\u00A0\u2028\u2029]
\t 匹配tab
\v 匹配垂直tab
接下来提下RegExp对象的属性:
global 是否全局匹配,返回true和false(布尔型),比如/\w/g.global返回true
ignoreCase 举一反一
multiline 举一反一++
lastIndex 标识下次匹配从哪里开始
source 匹配正则的文本表示(字符串),比如/\w/g.source返回 "\w",后面的匹配修饰字符会被省略
最后是重点,RegExp对象的方法,也即我们常用的exec和test。
先讲exec方法,语法是 regexp.exec([str])
该方法返回的是一个类似数组的对象(我不确定究竟是不是数组)。
var myRe = /d(b+)(d)/ig;
var myArray= myRe.exec("cdbBdbsbz");
在Chrome控制台下myArray为["dbBd", "bB", "d"]
myArray的属性提供了另外一些信息:
index 返回最近这次匹配在整个字符串中的索引(从0开始),这里为1
input 返回原始待匹配字符串,这里为"cdbBdbsbz"
[0] 即myArray[0],返回最近一次匹配的字符串,这里为dbBd。注意是完整匹配
[1] 返回完整匹配字符串中的括号中捕获的字符串,按照先后顺序,myArray[1]表示(b+)捕获的字
符串,这里为"bB"。同理myArray[2]表示(d)捕获的字符串,这里为"d"。myArray[n]...n没有上限
myRe的属性也有一些信息:网站源码
lastIndex 返回下次匹配的开始位置(0 index based),这里为5,即下次从s开始
ignoreCase、multiline、source上面已经说过了,就不啰嗦了
exec方法可以像下面这样多次使用,表示持续匹配(这个词可能不准确),想想lastIndex,比如下面:
var myRe = /ab*/g;
var str = "abbcdefabh";
myArray = myRe.exec(str);
console.log("第一次匹配到:" + myArray[0] + ",下次匹配从index " + myRe.lastIndex + "开始");
myArray2 = myRe.exec(str);
console.log("第二次匹配到:" + myArray[0] + ",下次匹配从index " + myRe.lastIndex + "开始");
输出为:http://www.huiyi8.com/webyuanma/
第一次匹配到:abb,下次匹配从index 3开始
第二次匹配到:abb,下次匹配从index 9开始
再讲下test方法,这个方法很简单,直接上实例:
var myRe = /\w+/g;
if(myRe.test("abc")) {
alert("hello");
}
已经讲得够多了,但是我觉得还是得提下字符串的replace方法,就一个小例子:
var re = /(\w+)\s(\w+)/;
str = "John Smith";
newStr = str.replace(re, "$2, $1");// 结果为 Smith, John
顺带提下,JavaScript不支持反向预搜索,但这里顺带提下反向预搜索:
反向预搜索也包括两种 (?<=y)x 和 (?<!y)x,前者表示匹配字符'x’仅当它前面紧跟'y'。后者表示匹配字符'x'仅当它前面不紧跟'y'。
(?<=\d{4})\d+(?=\d{4})将匹配 '1234567890123456' 中除去头部四个数字和尾部四个数字外的其他数字,即56789012
JavaScript正则表达式API的更多相关文章
- JavaScript正则表达式学习笔记(二) - 打怪升级
本文接上篇,基础部分相对薄弱的同学请移步<JavaScript正则表达式学习笔记(一) - 理论基础>.上文介绍了8种JavaScript正则表达式的属性,本文还会追加介绍几种JavaSc ...
- 《JavaScript 正则表达式迷你书》知识点小抄本
介绍 这周开始学习老姚大佬的<JavaScript 正则表达式迷你书> , 然后习惯性的看完一遍后,整理一下知识点,便于以后自己重新复习. 我个人觉得:自己整理下来的资料,对于知识重现,效 ...
- javascript正则表达式入门先了解这些
前言 此内容由学习<JavaScript正则表达式迷你书(1.1版)>整理而来(于2020年3月30日看完).此外还参考了MDN上关于Regex和String的相关内容,还有ECMAScr ...
- javascript的api设计原则
前言 本篇博文来自一次公司内部的前端分享,从多个方面讨论了在设计接口时遵循的原则,总共包含了七个大块.系卤煮自己总结的一些经验和教训.本篇博文同时也参考了其他一些文章,相关地址会在后面贴出来.很难做到 ...
- JavaScript正则表达式,你真的知道?
一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...
- 【JS】javascript 正则表达式 大全 总结
javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...
- 理清JavaScript正则表达式--上篇
在JavaScript中,正则表达式由RegExp对象表示.RegExp对象呢,又可以通过直接量和构造函数RegExp两种方式创建,分别如下: //直接量 var re = /pattern/[g | ...
- 理清JavaScript正则表达式--下篇
紧接:"理清JavaScript正则表达式--上篇". 正则在String类中的应用 类String支持四种利用正则表达式的方法.分别是search.replace.match和s ...
- 深入理解javascript选择器API系列第三篇——h5新增的3种selector方法
× 目录 [1]方法 [2]非实时 [3]缺陷 前面的话 尽管DOM作为API已经非常完善了,但是为了实现更多的功能,DOM仍然进行了扩展,其中一个重要的扩展就是对选择器API的扩展.人们对jQuer ...
随机推荐
- jquery知识汇总
jQuery 选择器 选择器 实例 选取 * $ ...
- Leetcode 数组问题:删除排序数组内的重复项
问题描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- Execption异常 手动和自动抛除异常
package cn.zmh.Exception; /* * * try{ * 需要被检测的语句 * } * catch(异常类 变量){ * 异常的处理语句 * } * finally{ * 一定会 ...
- 【IntelliJ IDEA】2017.3.4版本永久破解
[本版本软件包和破解jar在网盘上有 我的网盘--技术--idea破解所需要的] 1.idea官网下载 历史版本 选择2017.3.4版本下载 https://www.jetbrains.com ...
- TeX系列: tikz-3dplot绘图宏包
tikz-3dplot包提供了针对TikZ的命令和坐标变换样式, 能够相对直接地绘制三维坐标系统和简单三维图形. tikz-3dplot包当前处于初创期, 有很多功能有待完善. 安装过程如下: (1) ...
- 【Lucene】具体解释Lucene全文检索的信息写入与读取
Lucene的大致结构图: 信息写入索引库的过程: 读取信息的过程: 以下是一个向索引库写入信息与读取信息的样例: public void testCreateIndex() throws Excep ...
- 向C#的选项卡中添加自定义窗体
一.自定义窗体的搭建 这个比较简单,添加一个WinForm窗体就行了,设置一个名字EditPanel,然后在窗体上画需要的控件. 二.将自定义窗体添加到选项卡 // 新建窗体加入到选项卡中 EditP ...
- Android4.42-Setting源代码分析之蓝牙模块Bluetooth(下)
接着上一篇Android4.42-Settings源代码分析之蓝牙模块Bluetooth(上) 继续蓝牙模块源代码的研究 THREE.蓝牙模块功能实现 switch的分析以及本机蓝牙重命名和可见性的分 ...
- weex 阶段总结
新年伊始,回顾过去的一年,收获很多,之前一直在研究weex,说心里话感觉心好累,官方文档不全,社区不活跃,遇到很多坑,官方发布的版本有时都有坑,搞得我都不敢更新版本了. 但是,研究了这么久,放弃太可惜 ...
- java开始到熟悉66-69
本次内容:DateFormat类 1.DateFormat类 package array; /** * 时间和字符串之间的转化 */ import java.text.DateFormat; impo ...