2010-12-01 4 views
1

RegExpリテラルと文字列の使用に違いはありますか?JavaScript RegExp:異なる結果:文字列を使用し&regexp "literal"を使用してパターンを作成しましたか?

http://jsfiddle.net/yMMrk/

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オブジェクトを使用している場合でも、私はまだ同じ結果を得る

http://jsfiddle.net/yMMrk/2/

答えて

5

あなたはであなたの\をエスケープする必要があります文字列のバージョンは\\、このように:

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) 

You can test it out here

2

一般に、文字列を使用して正規表現を構築する場合は、バックスラッシュをエスケープする必要があります。正規表現リテラルを使用する場合は、正規表現でスラッシュがエスケープする必要があります。

"\\s/" 

と、このようなリテラルJavaScriptの正規表現のように:

/\s\// 

また、そこだから、正規表現

\s/ 

はこのようなJavaScriptの文字列として記述することができ

モード変更子の扱いの違いです。たとえば、正規表現大文字と小文字を区別しないを作るために、あなたはこのようにJavaScriptの文字列から正規表現オブジェクトを作成することができます:正規表現リテラルで

var myre = new RegExp("[a-z]", "i"); 

を、あなたは直接それを行うことができます。また

var myre = /[a-z]/i; 

this tutorialを参照してください。

関連する問題