使用RegExp文字与字符串之间是否有任何区别?
String.prototype.lastIndexOf = function(pattern) {
pattern = pattern + "(?![\s\S]*" + pattern + ")";
var match = this.match(pattern);
return (match == null) ? -1 : match.index;
}
function indexOfLastNewline(str) {
var match = str.match(/\r?\n(?![\s\S]*(\r?\n))/);
return (match == null) ? -1 : match.index;
}
var str = "Hello 1\nHello 2\nHello 3\nHello4";
alert(str.lastIndexOf("(\r?\n)")); // always returns the 1st newline (7)
alert(indexOfLastNewline(str)); // returns correctly (23)
更新
即使我使用RegExp
对象,我仍然会得到相同的结果
答案 0 :(得分:6)
您需要将字符串版本中的\
转义为\\
,如下所示:
String.prototype.lastIndexOf = function(pattern) {
pattern = pattern + "(?![\\s\\S]*" + pattern + ")";
var match = this.match(pattern);
return (match == null) ? -1 : match.index;
}
function indexOfLastNewline(str) {
var match = str.match(/\r?\n(?![\s\S]*(\r?\n))/);
return (match == null) ? -1 : match.index;
}
var str = "Hello 1\nHello 2\nHello 3\nHello4";
alert(str.lastIndexOf("(\\r?\\n)")); // returns correctly (23)
alert(indexOfLastNewline(str)); // returns correctly (23)
答案 1 :(得分:2)
一般来说,如果使用字符串构造正则表达式,则需要转义反斜杠;如果使用正则表达式文字,则需要在正则表达式中出现斜杠。
所以正则表达式
\s/
可以写成这样的JavaScript字符串:
"\\s/"
以及像这样的JavaScript正则表达式字面值:
/\s\//
此外,模式修饰符的处理也有所不同。例如,要使正则表达式不区分大小写,可以从JavaScript字符串构造一个正则表达式对象,如下所示:
var myre = new RegExp("[a-z]", "i");
使用正则表达式文字,您可以直接执行此操作:
var myre = /[a-z]/i;
另请参阅this tutorial。