javascript正則表達式

定义一个正則表達式

能够用字面量

var regex = /xyz/;
var regex = /xyz/i;

也能够用构造函数

var regex = new RegExp(‘xyz‘);
var regex = new RegExp(‘xyz‘, "i"); // 第二个參数表示修饰符

正則表達式组成

直接量字符

直接量字符如\a

特殊含义的字符须要转义

假设使用RegExp方法生成正则对象,转义须要使用两个斜杠。由于字符串内部会先转义一次。

(new RegExp("1\+1")).test("1+1") // false
(new RegExp("1\\+1")).test("1+1") // true

字符类

字符 匹配
[…] 方括号内的随意字符
[^…] 不在方括号内的随意字符
- 连字符
. 除了换行符和行结束符
\w 不论什么ASCII字符组成的单词=[a-zA-Z0-9]
\W =[^a-zA-Z0-9]
\s 空白字符
\S 非空白字符
\d ASCII数字=[0-9]
\D [^0-9]

连字符-[1-31]表示1至3。而不是到31

字符类的连字符必须在头尾两个字符中间,才有特殊含义。否则就是字面含义。比方。[-9]就表示匹配连字符和9,而不是匹配0到9。

反复

字符 描写叙述
{n,m}
{n,}
{n}
? 0次或1次
+ 在于等于1次
* 在于等于0次

非贪婪反复

在上面的反复字符后加上?就是非贪婪反复。

/a+/匹配字符串aaa时,会匹配aaa。而/a+?/会匹配a

正則表達式的模式匹配总是会寻找字符串中第一个可能匹配的位置。如/a+b/匹配aaab时,会匹配aaab/a+?

b/也会匹配’aaab’,都是从aaab中的第一个a開始匹配。所以,非贪婪模式并不表示最短匹配。

选择、分组和引用

选择

|

匹配abcdef

/ab|cd|ef/

分组

()

var m = "abcabc".match(/(.)b(.)/);
m; // ["abc", "a", "c"]

非捕获组

(?:x)称为非捕获组(Non-capturing group)。表示不返回该组匹配的内容。即匹配的结果中不计入这个括号。

var m = "abc".match(/(?

:.)b(.)/);
m[1]; // "c"

引用

\n

从1開始

不能在字符类中使用引用

指定匹配位置

字符 描写叙述
^
$
\b 匹配单词边界
\B 匹配非单词边界
(?=p) x(?=y)称为先行断言(Positive look-ahead),x仅仅有在y前面才匹配。y不会被计入返回结果。
(?

!p)

x(?!y)称为后行断言(Negative look-ahead),x仅仅有不在y前面才匹配。y不会被计入返回结果。

[\b]匹配的是退格

关于(?=p)(?!p)

var m = "abc".match(/b(?

=c)/);
m; // "b"

var m = "abd".match(/b(?

!c)/);
m; // ["b"]

修饰符

字符 描写叙述
i 不区分大写和小写
g 默认情况下,第一次匹配成功后。正则对象就停止向下匹配了。g修饰符表示全局匹配(global),加上它以后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换。
m 字符串的头部或尾部可能会有换行符。

默认情况下,正则对象会将换行符算入字符串的开头或结尾。

m修饰符表示多行模式(multiline),加上它以后。正则对象会忽略字符串头部或尾部的换行符,即^和$会忽略换行符。

关于m

/world$/.test("hello world\n") // false
/world$/m.test("hello world\n") // true

上面的代码中。字符串结尾处有一个换行符。假设不加m修饰符,匹配不成功,由于字符串的结尾不是world;加上以后,换行符被省略,匹配成功。


属性和方法

ignoreCase:返回一个布尔值,表示是否设置了i修饰符,该属性仅仅读。

global:返回一个布尔值。表示是否设置了g修饰符,该属性仅仅读。

multiline:返回一个布尔值。表示是否设置了m修饰符,该属性仅仅读。

var r = /abc/igm;

r.ignoreCase // true
r.global // true
r.multiline // true

lastIndex:返回下一次開始搜索的位置。该属性可读写。可是仅仅在设置了g修饰符时有意义。

source:返回正則表達式的字符串形式(不包括反斜杠),该属性仅仅读。

var r = /abc/igm;

r.lastIndex // 0
r.source // "abc"

test()

正则对象的test方法返回一个布尔值。表示当前模式能否匹配參数字符串。

/cat/.test(‘cats and dogs‘) // true

假设正則表達式带有g修饰符,则每一次test方法都从上一次结束的位置開始向后匹配。

r.lastIndex // 0
r.test(s) // true

r.lastIndex // 2
r.test(s) // true

r.lastIndex // 4
r.test(s) // false

带有g修饰符时,能够通过正则对象的lastIndex属性指定開始搜索的位置

var r = /x/g;
var s = ‘_x_x‘;

r.lastIndex = 4;
r.test(s) // false

exec()

正则对象的exec方法,能够返回匹配结果。假设发现匹配。就返回一个数组,每一个匹配成功的子字符串,就是数组成员,否则返回null。

var s = ‘_x_x‘;
var r1 = /x/;
var r2 = /y/;

r1.exec(s) // ["x"]
r2.exec(s) // null

假设正则表示式包括圆括号(即要求“组匹配”),则返回的数组会包括多个元素。

当中,第一个元素是整个匹配成功的结果,后面的元素就是圆括号相应的匹配成功的组。

也就是说。第二个元素相应第一个括号,第三个元素相应第二个括号,以此类推。

exec方法的返回数组还包括下面两个属性:

input:整个原字符串。

index:整个模式匹配成功的開始位置(从0開始)。

var r = /a(b+)a/;
var arr = regex.exec("_abbba_aba_");

arr // ["abbba", "bbb"]

arr.index // 1
arr.input // "_abbba_aba_"

假设正則表達式加上g修饰符,则能够使用多次exec方法,下一次搜索的位置从上一次匹配成功结束的位置開始。

var r = /a(b+)a/g;

var a1 = r.exec("_abbba_aba_");
a1 // ["abbba", "bbb"]
a1.index // 1
r.lastIndex // 6

var a2 = r.exec("_abbba_aba_");
a2 // ["aba", "b"]
a2.index // 7
r.lastIndex // 10

var a3 = r.exec("_abbba_aba_");
a3 // null
a3.index // TypeError: Cannot read property ‘index‘ of null
r.lastIndex // 0

var a4 = r.exec("_abbba_aba_");
a4 // ["abbba", "bbb"]
a4.index // 1
r.lastIndex // 6

字符串中与正則表達式相关的4个函数

match

match方法与正则对象的exec方法很相似:匹配成功返回一个数组,匹配失败返回null。

假设正則表達式带有g修饰符,则该方法与正则对象的exec方法行为不同。会一次性返回全部匹配成功的结果。

var s = "abba";
var r = /a/g;

s.match(r) // ["a", "a"]
r.exec(s) // ["a"]

设置正則表達式的lastIndex属性,对match方法无效。匹配总是从字符串的第一个字符開始。

search

字符串对象的search方法。返回第一个满足条件的匹配结果在整个字符串中的位置。假设没有不论什么匹配,则返回-1。

该方法会忽略g修饰符。

设置正則表達式的lastIndex属性,对match方法无效,匹配总是从字符串的第一个字符開始。

replace

它接受两个參数,第一个是搜索模式,第二个是替换的内容。

搜索模式假设不加g修饰符。就替换第一个匹配成功的值。否则替换全部匹配成功的值。

replace方法的第二个參数能够使用美元符号$,用来指代所替换的内容。

$ & 指代匹配的子字符串。

$` 指代匹配结果前面的文本。

$’ 指代匹配结果后面的文本。

$n 指代匹配成功的第n组内容。n是从1的自然数。

"hello world".replace(/(\w+)\s(\w+)/,"$2 $1")
// "world hello"

"abc".replace("b", "[$`-$&-$‘]")
// "a[a-b-c]c"

replace方法的第二个參数还能够是一个函数,将匹配内容替换为函数返回值。

作为replace方法第二个參数的替换函数,能够接受多个參数。它的第一个參数是捕捉到的内容,第二个參数是捕捉到的组匹配(有多少个组匹配,就有多少个相应的參数)。

此外。最后还能够加入两个參数,倒数第二个參数是捕捉到的内容在整个字符串中的位置(比方从第五个位置開始)。最后一个參数是原字符串。

split

字符串对象的split方法依照正则规则切割字符串,返回一个由切割后的各个部分组成的数组。

该方法接受两个參数。第一个參数是分隔规则。第二个參数是返回数组的最大成员数。

‘a,  b,c, d‘.split(‘,‘)
// [ ‘a‘, ‘  b‘, ‘c‘, ‘ d‘ ]

‘a,  b,c, d‘.split(/, */)
// [ ‘a‘, ‘b‘, ‘c‘, ‘d‘ ]

‘a,  b,c, d‘.split(/, */, 2)
[ ‘a‘, ‘b‘ ]

空格能够直接用/, */


时间: 2024-11-10 08:15:06

javascript正則表達式的相关文章

JavaScript正則表達式知识汇总

Js 正則表達式知识汇总 正則表達式: 1.什么是RegExp?RegExp是正則表達式的缩写.RegExp 对象用于规定在文本中检索的内容. 2.定义RegExp:var +变量名=new RegExp(); 3.RegExp 对象有 3 个方法: 1)test()检索字符串中的指定值,返回值是true或false. var p1=new Reg("e"); document.write(Reg.test("welcome to China!")); 2)exec

DOM笔记(十):JavaScript正則表達式

一.RegExp ECMAScript通过RegExp类型类支持正則表達式,语法和Perl类似: var exp = /pattern/flags; patternb部分是不论什么简单的或复杂的正則表達式:flags是每一个正則表達式所带的一个或者多个标志. 正則表達式的模式匹配支持三个标志: g:全局模式,即模式应用于整个字符串.而非在发现第一个匹配项时马上停止 i:不区分大写和小写模式 m:多行模式,即到达一行文本末尾是还会继续茶查找下一行中是否存在与模式匹配的项. 1.创建正則表達式 Ja

经常使用的正則表達式归纳—JavaScript正則表達式

来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則表達式: 匹配中文字符的正則表達式: [\u4e00-\u9fa5] 匹配双字节字符(包含汉字在内):[^\x00-\xff] 匹配空白行的正則表達式:\n\s*\r ps:能够用来删除空白行 匹配HTML标记的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*

JavaScript使用正則表達式

2.0 简单介绍 正則表達式是能够用来查找与给定模式匹配的文本的搜索模式.比如,在上一章中,我们在一个较长的字符串中查找子字符串Cookbook: var testValue = "This is the Cookbook's test string"; var subsValue = "Cookbook"; var iValue = testValue.indexOf(subsValue); //返回值12.即子字符串的索引 这段代码有效.由于我们要查找一个严格的

js正則表達式语法

1. 正則表達式规则 1.1 普通字符 字母.数字.汉字.下划线.以及后边章节中没有特殊定义的标点符号,都是"普通字符".表达式中的普通字符,在匹配一个字符串的时候,匹配与之同样的一个字符. 举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功:匹配到的内容是:"c":匹配到的位置是:開始于2,结束于3.(注:下标从0開始还是从1開始,因当前编程语言的不同而可能不同) 举例2:表达式 "bcd&

javascript中的正則表達式

对文本数据进行操作是JavaScript中常见的任务.正則表達式通过同意程序猿指定字符串匹配的模式来简化诸如验证表单中输入是否具有正确格式之类的任务. 1.正則表達式标记: 字符 含义 举例 i 大写和小写不敏感 对于模式/http/i  "http" 和"HttP" 一样能够匹配 g 全局匹配.找出所有匹配字符串,而不不过找到第一个就返回. 经常使用于替换 m 多行匹配 2.正則表達式位置指示符:规定模式在它所匹配的字符串里的位置. 字符 含义 举例 ^ 开头 对

JavaScript之正則表達式入门

<html> <head><title>Js String 正則表達式</title><script>//边界符 js 中直接定义须要边界符// ?java里面不须要边界符var re = /abc/;//匹配abc的document.write(re.test("abcdabc")+","+re.test("XXXC")+"<br/>");re =/\/

正則表達式常见例题

常见例题 例1:北美地区的电话号 编码方案:电话号码有一个3位数的区号和一位7位数的号码组成(这个7位数有分成  一个3位的局号和一个4位的路号.局号和路号之间使用连字符分隔) 每位电话号码能够是随意数字,可是区号和局号的第一位数字不能是0或1.实际书写号码是往往会把区号写在括号中面,或者将区号使用连字符和后面的局号连接起来.比如:(555)123-1234或555-123-1234,有时候在括号你里面会包括空格.比如:(555 )123-1234 文本: J.Doe:248-555-1234

最全正則表達式汇总—想要的都有了

正则式太难学,并且easy忘记 ,西西是看过非常多次.都是一会就所有不记得了滴.非常多不太懂正则的朋友.在遇到须要用正则校验数据时,往往是在网上去找非常久.结果找来的还是不非常符合要求. 所以我近期把开发中经常使用的一些正則表達式整理了一下.在这里分享一下. 给自己留个底,也给朋友们做个參考. 一.校验数字的表达式 1 数字:^[0-9]*$ 2 n位的数字:^\d{n}$ 3 至少n位的数字:^\d{n,}$ 4 m-n位的数字:^\d{m,n}$ 5 零和非零开头的数字:^(0|[1-9][