RegExp构造函数的相关属性
提出问题
- 相关代码
var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)){
console.log(RegExp.input); // this has been a short summer
console.log(RegExp.leftContext); // this has been a
console.log(RegExp.rightContext); // summer
console.log(RegExp.lastMatch); // short
console.log(RegExp.lastParen); // s
console.log(RegExp.multiline); // false
}
- 问题描述
if下面六条语句分别是RegExp构造函数所包含的属性,前五个都可以正常输出,但是最后一条在使用multiline的时候用google浏览器chorm输出会出现undefined的情况,并不能如常输出false,问题在此。
- 相关知识点
RegExp构造函数包含相关属性包含以上几种:
长属性名 | 短属性名 | 相关说明 |
---|---|---|
input | $_ | 距离代码中最近的要匹配的字符串。Opera未实现此属性 |
lastMatch | $& | 距离代码中最近的一次匹配项,Opera未实现此属性 |
lastParen | $+ | 距离代码中最近的一次匹配的捕获组(即代码中你要求匹配的位置当时要求的那个字符)。Opera未实现此属性 |
leftContext | $` | input字符串中lastMatch之前的文本 |
multiline | $* | 布尔值,表示是否所有表达式都是用多行模式。IE和Opera未实现此属性 |
rightContext | $’ | Input字符串中lastMatch之后的文本 |
在属性介绍之后,着重介绍multiline这个属性。multiline这个属性表明正则表达式是否使用了”m”标志。multiline是正则表达式实例的一个只读属性。
multiline是一个布尔对象,如果使用了“m”标志,则返回true;否则,返回false。“m”标志意味着一个多行输入字符串被看做多行。
引入一个例子:
var regex = new RegExp("foo", "m")
console.log(regex.multiline) // true
此时在RegExp中使用了对“m”的标志,所以相当于去在下面运用multiline这个属性的过程中已经定义了“m”,所以返回值应该是ture。
- 结论
所以说在使用RegExp的六个属性:input,lastMatch,lastParen,leftContext,rightContext和multiline。但是最后一个multiline其实和另外两个属性global,ignorecase是同一级别的定义,在使用之前都需要定义。详细理解请看下面的例子:
var str='Hello This World';
var pattern=/hello/gi;
var result=str.match(pattern);
console.log(result); / "Hello"
var str='Hello This World';
var pattern=/Hello/;
var result=str.match(pattern);
console.log(result); /"Hello", index: 0, input: "Hello This World"
var str='Hello This World';
var pattern=/hello/g;
var result=str.match(pattern);
console.log(result); / null
var text = "this has been a short summer";
var pattern = /(.)hort/g;
if (pattern.test(text)){
console.log(RegExp.input); /this has been a short summer
console.log(RegExp.leftContext); /this has been a
console.log(RegExp.rightContext); /summer
console.log(RegExp.lastMatch); /short
console.log(RegExp.lastParen); /s
console.log(RegExp("b","m").multiline); /true
}