字符串: 编程时涉及最多的一种数据结构.对字符串操作的需求几乎无处不在

比如判断一个字符串是否是合法的 Email 地址.

正则表达式 是一种用来匹配字符串的强有力的武器.

\d 匹配一个数字, \w 匹配一个字母或数字, \s 匹配一个空格(也包括Tab等空白符)

[]表示范围

. 匹配任意字符 * 表示任意个字符(包括0个) + 表示至少一个字符, ? 表示0个或1个字符, {n} 表示n个字符, {n,m} 表示n-m个字符:

A|B 可以匹配A或B

所以(J j)ava(S s)cript可以匹配’JavaScript’、’Javascript’、’javaScript’或者’javascript’。

^ 表示行的开头,^\d 表示必须以数字开头。 $ 表示行的结束,\d$ 表示必须以数字结束

g 表示全局匹配: i 标志,表示忽略大小写, m 标志,表示执行多行匹配。

'00\d'可以匹配'007',但无法匹配'00A'; '\d\d\d'可以匹配'010'; '\w\w'可以匹配'js'; 'js.'可以匹配'jsp'、'jss'、'js!'等等。

[0-9a-zA-Z\_] 可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+ 可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,0_Z,’js2015’等等;

[a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、$开头,后接任意个由一个数字、字母或者下划线、$组成的字符串,也就是JavaScript允许的变量名;

[a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19} 更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

js 也可以匹配’jsp’,但是加上 ^js$ 就变成了整行匹配,就只能匹配’js’了。

例子:

\d{3}\s+\d{3,8}

  • \d{3} 表示匹配3个数字开头,例如’010’;
  • \s+ 表示至少有一个空格,
  • \d{3,8}表示3-8个数字,例如’1234567’。

综合起来,上面的正则表达式可以匹配以任意个空格隔开的带区号的电话号码。

匹配’010-12345’

于’-‘是特殊字符,在正则表达式中,要用’'转义, \d{3}\-\d{3,8}

匹配’010 - 12345’

JS 创建 正则表达式

  1. 直接写 表达式
  2. 通过 new RegExp(‘表达式’) 创建正则式对象
var rel = /ABC\-001/;
var rel2 = new RegExp('ABC\\-001');
// 第二种 需要两个\\ 是由于 字符串转义的问题. 实际是一个\.


*RegExp对象的 test()方法  用于测试给定的字符串是否符合条件。*

var re = /^\d{3}-\d{3,8}$/; console.log(re.test(‘010-12345’)); → true
console.log(re.test(‘010-1234x’)); → false

切分字符串.

'a b c'.split(' '); // ['a', 'b', '', '', 'c']
'a b c'.split(/\s+/); // ['a', 'b', 'c'] 我们需要的是去空格. 第一种就无法识别连续的多个空格..

'a,b, c d'.split(/[\s\,]+/); // ['a', 'b', 'c', 'd'] 'a,b;; c d'.split(/[\s\,\;]+/); // ['a', 'b', 'c', 'd']

如果用户输入了一组标签,下次记得用正则表达式来把不规范的输入转化成正确的数组。

分组: () + exec  除了简单地判断是否匹配之外,正则表达式还有提取子串的强大功能。

var re = /^(\d{3})-(\d{3,8})$/;
re.exec('010-12345'); // ['010-12345', '010', '12345']
re.exec('010 12345'); // null

如果正则表达式中定义了组,就可以在RegExp对象上用exec()方法提取出子串来。

- exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串。
- exec()方法在匹配失败时返回null。


*识别合法的时间*
`var re = /^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$/;`
`re.exec('19:05:30'); // ['19:05:30', '19', '05', '30']`
时间提取. 小时不超过24.. 分钟不超60..




*贪婪匹配(default)*
匹配尽可能多的字符.
`var re = /^(\d+)(0*)$/;`
`re.exec('102300'); // ['102300', '102300', '']`
`由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。`

*加个 ?(0或1个字符) 就可以让 `\d+` 采用非贪婪匹配:*
`var re = /^(\d+?)(0*)$/;`
`re.exec('102300'); // ['102300', '1023', '00']`





##### 全局搜索

JavaScript的正则表达式还有几个特殊的标志,最常用的是g,表示全局匹配:

`var r1 = /test/g;`

var s = ‘JavaScript, VBScript, JScript and ECMAScript’; var re=/[a-zA-Z]+Script/g;

// 使用全局匹配: re.exec(s); // [‘JavaScript’] re.lastIndex; // 10

re.exec(s); // [‘VBScript’] re.lastIndex; // 20

re.exec(s); // [‘JScript’] re.lastIndex; // 29

re.exec(s); // [‘ECMAScript’] re.lastIndex; // 44

re.exec(s); // null,直到结束仍没有匹配到

正则式表达

/and/gi

// 是开始和 结尾. and 是要查找的内容. g 是全局查找 i 是忽略大小写

/\d/g\d 是查找数字. 0-9 .

/\d+/g → 加号. 可以查找出多个结果.

\n newline \t tab \f form feed " " space \s 也是空格

/查找空格:

大写 就是 反选的意思: \s 是匹配空白. \S 是匹配空白之外的所有符号. 可用于文章字数计数器

匹配特定字符串: 只能输入长度为3的字符:"^.{3}$"。 只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。 只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。 只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。 只能输入由数字和26个英文字母组成的字符串:"^[A-Za-z0-9]+$"。 只能输入由数字、26个英文字母或者下划线组成的字符串:"^\w+$"。

单词拆成字母:

hello → ["h","e","l","l","o"] str = “helli” str = str.split(‘’);

var str="How are you doing today?" document.write(str.split(" ") + "<br />") How,are,you,doing,today? document.write(str.split("") + "<br />") H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,? document.write(str.split(" ",3)) How,are,you