正则表达式-基本方法

发布于 2019-08-25  1 次阅读


new RegExp和//

newRegExp对比//可以使用变量插入

let search = prompt("What you want to search?", "love");
let regexp = new RegExp(search);

// 找到用户想要的任何东西
alert( "I love JavaScript".search(regexp));

修饰符

  • i:不区分大小写
  • g:搜索时匹配所有项
  • m:多行模式
  • u:开启完整的unicode支持
  • y:粘滞模式

str.search(reg)

返回第一个匹配项的位置,没有返回-1

let str = "A drop of ink may make a million think";

alert( str.search( /a/i ) ); // 0(最开始的位置)

str.match(reg) 没有修饰符g

只查找第一个匹配项,返回一个数组,如果没有匹配项,返回null
* index -匹配项在字符串中的位置
* input -原始字符串

let str = "Fame is the thirst of youth";

let result = str.match( /fame/i );

alert( result[0] );    // Fame(匹配项)
alert( result.index ); // 0(在最开始的位置 0)
alert( result.input ); // “Fame is the thirst of youth”(字符串本身)

如果模式的一部分被括号 (...) 括起来了,那么这部分将会独占数组的一个元素。

let str = "JavaScript is a programming language";

let result = str.match( /JAVA(SCRIPT)/i );

alert( result[0] ); // JavaScript(整个匹配项)
alert( result[1] ); // script(对应括号里的匹配项)
alert( result.index ); // 0
alert( result.input ); // JavaScript is a programming language

由于i修饰符不区分大小写,因此为找到JavaScript与SCRIPT

str.match(reg) 使用修饰符g

使用g修饰符的时候,会返回所有的匹配的数组,并且也没有额外的属性

let str = "HO-Ho-ho!";

let result = str.match( /ho/ig );

alert( result ); // HO, Ho, ho(所有的匹配项,大小写不敏感)

str.split()

使用sregexp或子字符串作为分隔符分割字符串

alert('12-34-56'.split('-')) // [12, 34, 56]
alert('12-34-56'.split(/-/)) // [12, 34, 56]

str.replace(str|reg, str|func)

第一个参数

第一个参数是字符串时,只会查找第一个匹配;匹配全部则使用reg,使用g修饰符

第二个参数

str

符号插入
$$"$"
$&整个匹配项
$`匹配项前面的字符串部分
$'匹配项后面的字符串部分
$n如果n是一个1-2位的数组,那么这表示从左到右数第n个括号的内容
let str = "John Smith";

alert(str.replace(/(John) (Smith)/, '$2, $1')) // Smith, John

func

  • str -匹配项
  • p1,p2,..., pn -圆括号里的内容
  • offset -匹配项所在的位置
  • s -原字符串

如果regexp中没有有圆括号,那么该函数总有3个参数func(str,offset,s)

// 显示并且替换所有的匹配项
function replacer(str, offset, s) {
  alert(`Found ${str} at position ${offset} in string ${s}`);
  return str.toLowerCase();
}

let result = "HO-Ho-ho".replace(/ho/gi, replacer);
alert( 'Result: ' + result ); // Result: ho-ho-ho

// shows each match:
// Found HO at position 0 in string HO-Ho-ho
// Found Ho at position 3 in string HO-Ho-ho
// Found ho at position 6 in string HO-Ho-ho

如果regexp中有圆括号,那么该函数参数func(str,p1,p2, ..., pn, offset, s)

function replacer(str, name, surname, offset, s) {
  // name is the first parentheses, surname is the second one
  return surname + ", " + name;
}

let str = "John Smith";

alert(str.replace(/(John) (Smith)/, replacer)) // Smith, John

regexp.test(str)

查找任何符合的匹配,无论是否找到,返回true/false

regexp.exec(str)

不带g修饰符

返回第一个匹配项,也就是str.match(reg)

带g修饰符

  1. 如果有匹配项,返回第一个匹配项,然后在regexp.lastIndex里记住该匹配项结束的位置
  2. 下一次调用从regexp.lastIndex开始搜索,返回匹配项
  3. 如果再没有匹配项,返回null,regexp.lastIndex置为0
let str = 'A lot about JavaScript at https://javascript.info';

let regexp = /javascript/ig;

let result;

while (result = regexp.exec(str)) {
  alert( `Found ${result[0]} at ${result.index}` );
}
//也可以从指定位置开始搜索
let str = 'A lot about JavaScript at https://javascript.info';

let regexp = /javascript/ig;
regexp.lastIndex = 30;

alert( regexp.exec(str).index ); // 34,搜索从位置 30 开始


这个时间很美好,但它也很残酷