2012-02-10 10 views
0

Regexが特殊文字のリテラルをどのように検索するかを理解しようとしています。これは私の質問を説明するために考えることができる最も簡単な例です。

私はリテラルを探しています。私は、文字列
Javascript Regular Exp

'sp.o'.search('.') 
//it returns 0 which makes sense. 

は、その後、私はそれら

'sp.o'.search('\.') 
// it returns 0 ! 
// I come from vim flavor regex 
// It does not make sense to me =(

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp

一体私が行方不明です何
'sp.o'.search('\\.') 
// returns 2 ! 
// the correct out put I am looking for 

に応じMDNを読んで! (この動作はGoogle ChromeとNodeJSの両方にありますが、他の場所で試してみませんでした)

+0

なぜ正規表現を使用して単純なリテラルを検索するのですか? '.indexOf()'ははるかに安価です。 –

+0

REGEXについて質問しています。私のタイトルは人々を混乱させると思う。私は問題の最も単純な例を与えたばかりです。 – Prospero

+0

すべての苦情は十分に公正です。私は自分の疑問を解消した。 – Prospero

答えて

4

文字列のため、\は、次の文字をエスケープすることを意味します。 .は特別な文字列ではないので、文字列として扱います。

あなたが "\\."はあなたが望むものである文字列リテラル \.を生成する理由であるスラッシュ( \)ない期間を、脱出したい
"\." === "." 

。以上の明示:

"\\" + "." === "\\." // or a literal: \.

しかし、他の記事が正しい、あなたはおそらくだけではなく、正規表現として文字列を解析するよりも、正規表現リテラルを使用します。

4

正規表現ではなく文字列を使用しています。使用:

/regexphere/ 

それは動作します:あなたは、文字列、ない表現で検索している

'sp.o'.indexOf('.'); // 2 
+0

文字列を使うことができます。文字列は単にRegExpに変換されます。 – benekastah

+0

@benekastah:私はそれに気づいた。しかし、それを使用するように助言しないだろう。 – pimvdb

+0

は大多数のプラットフォームで安全ですか? – Prospero

1

'sp.o'.search(/\./); // 2 

をしかし、あなたの場合には、.indexOfはあなたの友達です。試してみてください:

'sp.o'.search(/\./); // should return 2 
4

使用法はほぼ正しいです。他の人が指摘しているように、文字列ではなく正規表現リテラルを使用できます。しかし、ストリングも機能します。検索方法のMozilla docsによると:

非正規表現オブジェクトobjが渡された場合、それは暗黙のうちに新しい正規表現(OBJ)を使用して、正規表現に変換されます。

それはバックスラッシュであるためにはjavascriptの文字列にバックスラッシュをエスケープしなければならないため'\\.'作品と'\.'があるしない理由。それ以外の場合は、常にその前の文字をエスケープしようとします。この場合、'.'は何もエスケープしません。あなたはJavaScriptコンソールで、あなたの文字列を評価する場合は、これを取得します:

'\.' // => '.' 
'\\.' // => '\.' 

文字列は、舞台裏でRegExpオブジェクトに渡されます。あなたはこの自分を行う場合、これはあなたが取得したいものです。

new RegExp('\.') // => /./ 
new RegExp('\\.') // => /\./ 

他の人が代わりに.searchの引数として文字列リテラル(例えば/\./)正規表現を使用して提案しました。両方とも動作しますが、正規表現リテラルを使用するのは、それがより明白で少し綺麗であるためです。

2

あなただけの理由だけで使用しないで、固定リテラルを探している場合は、次の正規表現は常に文字列の検索よりも高価である

if('sp.o'.indexOf('.') !== -1) ...