javascript 文字列を正規表現と一致させる必要があります。これは、単一引用符で囲まれた文字列であり、バックスラッシュ付きの単一引用符のみを含めることができます。
一致する文字列の例は次のとおりです。
'abcdefg'
'abc\'defg'
'abc\'de\'fg'
javascript 文字列を正規表現と一致させる必要があります。これは、単一引用符で囲まれた文字列であり、バックスラッシュ付きの単一引用符のみを含めることができます。
一致する文字列の例は次のとおりです。
'abcdefg'
'abc\'defg'
'abc\'de\'fg'
これは、すべての有効な JavaScript リテラル文字列 (一重引用符で囲まれている'
) に一致し、無効なものはすべて拒否する正規表現です。厳密モードが想定されていることに注意してください。
/'(?:[^'\\\n\r\u2028\u2029]|\\(?:['"\\bfnrtv]|[^\n\r\u2028\u2029'"\\bfnrtvxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})|\\(?:\n|\r\n|\r(?!\n)|[\u2028\u2029]))*'/
または短いバージョン:
/'(?:[^'\\\n\r\u2028\u2029]|\\(?:[^\n\rxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|\n|\r\n?))*'/
StringLiteral
上記の正規表現は、2011 年 6 月に発行された ECMAScript 言語仕様、5.1 版で指定されている (二重引用符で囲まれたバージョンを無視して)の定義に基づいています。
二重引用符で囲まれた JavaScript リテラル文字列の正規表現"
はほとんど同じです。
/"(?:[^"\\\n\r\u2028\u2029]|\\(?:[^\n\rxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|\n|\r\n?))*"/
モンスターを分析してみましょう (文法からの直訳なので長いバージョンです):
正規表現で見られるように、 (二StringLiteral
重引用符バージョンを無視して) は で始まり、で終わります。'
引用符の間には、オプションのSingleStringCharacter
. *
-0以上の文字について説明します。
SingleStringCharacter
と定義されている:
シングル文字列 :: SourceCharacter で、'、\、または LineTerminator のいずれでもない \エスケープシーケンス LineContinuation
[^'\\\n\r\u2028\u2029]
最初のルールに対応
\\(?:['"\\bfnrtv]|[^\n\r\u2028\u2029'"\\bfnrtvxu0-9]|0(?![0-9])|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})
2番目のルールに対応
\\(?:\n|\r\n|\r(?!\n)|[\u2028\u2029])
3番目のルールに対応
最初のルールを見てみましょう: SourceCharacter but not one of ' or \ or LineTerminator
. この最初のルールは、「通常の」文字を扱います。
SourceCharacter
任意の Unicode 単位です。
LineTerminator
ライン フィード<LF>
(\u000A
または\n
)、キャリッジ リターン<CR>
(\u000D
または\r
)、ライン セパレータ<LS>
( \u2028
)、またはパラグラフ セパレータ<PS>
( \u2029
) です。
したがって、このルールを表すために負の文字クラスを使用します: [^'\\\n\r\u2028\u2029]
.
エスケープ シーケンスを扱う 2 番目のルールについては、正規表現で表示される\
前に確認できます。EscapeSequence
に関してはEscapeSequence
、これはその文法です (strict モード):
エスケープシーケンス :: 文字エスケープシーケンス 0 [先読み ∉ DecimalDigit] HexEscapeSequence UnicodeEscapeSequence
['"\\bfnrtv]|[^\n\r\u2028\u2029'"\\bfnrtvxu0-9]
の正規表現ですCharacterEscapeSequence
。実際には次のように単純化できます[^\n\r\u2028\u2029xu0-9]
最初の部分は、 、、、および制御文字の 、、、、をSingleEscapeCharacter
含むです。'
"
\
b
f
n
r
t
v
2 番目の部分はNonEscapeCharacter
ですSourceCharacter but not one of EscapeCharacter or LineTerminator
。、または (16 進エスケープ シーケンスの場合) または(Unicode エスケープ シーケンスの場合)EscapeCharacter
として定義されます。SingleEscapeCharacter
DecimalDigit
x
u
0(?![0-9])
の 2 番目のルールの正規表現ですEscapeSequence
。空文字を指定するためのもの\0
です。
x[0-9a-fA-F]{2}
の正規表現ですHexEscapeSequence
u[0-9a-fA-F]{4}
の正規表現ですUnicodeEscapeSequence
3 番目のルールは、複数行にまたがる文字列を扱います。LineContinuation
およびその他の関連する文法を見てみましょう。
LineContinuation ::
\ LineTerminatorSequence
LineTerminatorSequence ::
<LF>
<CR> [lookahead ∉ <LF> ]
<LS>
<PS>
<CR> <LF>
\\(?:\n|\r\n|\r(?!\n)|[\u2028\u2029])
上記の文法に対応します。
これを試してください:
/'(?:[^'\\]|\\'|\\(?!'))*'/
コンソールでテストします。
/'(?:[^'\\]|\\'|\\(?!'))*'/.exec("'abc\\\'de\\\'fg'")
似合います
NOT ' or \
(を除外する)\'
(また)\
( が続かない'
)文字列全体に一致させたい場合は、文字列の^
開始$
マーカーと文字列の終了マーカーを使用します。
/^'(?:[^'\\]|\\'|\\(?!'))*'$/
... は一致'string'
します'string\'s are awesome'
が、'string's are awesome'
または'string's
そんなに難しくない…
また、エスケープせずに行を改行するなど\n
、他の可能な文字シーケンスを検出する必要があります。エスケープせずに改行することは JavaScript では無効です。シーケンスを使用する必要があります。\r
\\
\n
/^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/
実行中:
var sample = ["'abcdefg'", // Valid
"'abc\\'defg'", // Valid
"'abc\\'de\\'fg'", // Valid
"'abc\\'\\r\\nde\\'fg'", // Valid
"'abc\\'\r\nde\\'fg'", // Invalid
"'abc'def'" // Invalid
];
for(var i = 0; i < sample.length; i++)
console.log(sample[i].match( /^'([^\\'\n\r]|\\'|\\n|\\r|\\\\)*'$/ ));
^
次の条件が文字列の先頭と一致する必要があることをマッチャーに伝える'
'
区切り文字に一致します(
グループを開く[^\\'\n\r]
\
and以外のものに一致し、特殊文字および文字'
には一致しません\n
\r
|
上記の条件が何も一致しなかった場合、右側|
がテストされます\\'
一致します\'
\\n
\n
リテラル文字列に一致します|\\r
\r
またはリテラル文字列に一致します|\\\\
\\
またはリテラル文字列に一致します)*
グループを閉じて、複数回繰り返すことを許可し、存在しないことを許可します (たとえば、空の文字列)'
最後の'
区切り文字に一致します$
これが文字列の and でなければならないことをマッチャーに伝えるこれを試して
/^'([az]*(?:\')?[az])+'$/
ここで例を参照してください
str = 'abc\'de\'fg';
match = str.match(/^([a-z\\']+)$/g);
Firebug コンソールでテスト済み。エスケープ文字の有無にかかわらず動作します。