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含むです。'"\bfnrtv
2 番目の部分はNonEscapeCharacterですSourceCharacter but not one of EscapeCharacter or LineTerminator。、または (16 進エスケープ シーケンスの場合) または(Unicode エスケープ シーケンスの場合)EscapeCharacterとして定義されます。SingleEscapeCharacterDecimalDigitxu
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 コンソールでテスト済み。エスケープ文字の有無にかかわらず動作します。