-3

js では、エスケープされた文字を取得するには、ドット/文字をダブルエスケープする必要があります。それは変だ。なんで?

js:

"." == "." // true
"\." == "." // true
"\\." == "." // false

"\a" == "a" // true

python/php では、期待どおりに動作します。

"\." == "." // False

js 正規表現では、逆に動作します。なんと奇妙なことでしょう :)

"\.".search(/\./)  // no hit
"\\.".search(/\./) // hit

アップデート

TJ Crowderが正規表現の例が間違っていると正しく述べたように。\.もちろん、正規表現はリテラルのドットに一致します。

正しい例は次のとおりです。

// Find a literal backslash and a literal dot
"\\.".search(/\\\./) // position 0

// Find a literal Dot
"\\.".search(/\./) // position 1
4

1 に答える 1

7

js では、エスケープされた文字を取得するには、ドット/文字をダブルエスケープする必要があります。

「エスケープされた文字」は得られません。バックスラッシュとドットの 2 文字が表示されます。ドットは「エスケープ」されません。

\.JavaScript 文字列リテラルでは、シーケンスは特別なものではありません。仕様で定義されたもの以外のエスケープ シーケンスは、エスケープ文字を黙ってドロップするだけです。

あなたの例"\." == "."は、両方のリテラルが1 つの文字 (ドット)trueを持つ同じ文字列を定義しているためです。無効なエスケープは無視されます。

あなたの例"\\." == "."false、最初のリテラルが 2 つの文字 (バックスラッシュとドット) を含む文字列を定義し、2 番目のリテラルが 1 つの文字 (ドット) のみを含む文字列を定義するためです。

無効なエスケープ シーケンスに対する言語の対応は、言語によって異なります。JavaScript のように、無効なエスケープを無視するものもあります。他の人は、無効なエスケープ シーケンスをバックスラッシュとそれに続く次の文字として扱います。たとえば、エスケープを黙って削除するのではなく、バックスラッシュを黙ってエスケープします。


あなたの正規表現の例を再:

js 正規表現では、逆に動作します。なんと奇妙なことでしょう :)

"\.".search(/\./)  // no hit    <--- Wrong
"\\.".search(/\./) // hit

それは正しくありません。最初のものも同様にヒットします (「一致なし」の戻り値は であり-1、 ではありません0)。の戻り値"\.".search(/\./)0(インデックス 0 で一致が見つかりました。最初の文字が最初の文字であるため、これは理にかなっています.)。の戻り値"\\.".search(/\./)1(インデックス 1 で一致が見つかりました。これは意味があります。これ.は、2 番目の文字だからです)。

.そしてもちろん、正規表現リテラルでをエスケープしたことはまったく正しいことです。なぜなら、 はJavaScript 正規表現で. は特別だからです。

于 2013-05-15T11:33:58.557 に答える