1

javascript 文字列を正規表現と一致させる必要があります。これは、単一引用符で囲まれた文字列であり、バックスラッシュ付きの単一引用符のみを含めることができます。

一致する文字列の例は次のとおりです。

'abcdefg'
'abc\'defg'
'abc\'de\'fg'
4

4 に答える 4

2

これは、すべての有効な 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])上記の文法に対応します。

于 2012-12-10T11:29:10.947 に答える
0

これを試してください:

/'(?:[^'\\]|\\'|\\(?!'))*'/

コンソールでテストします。

/'(?:[^'\\]|\\'|\\(?!'))*'/.exec("'abc\\\'de\\\'fg'")

似合います

  • 次の任意の数の文字:
    • NOT ' or \(を除外する)
    • \'(また)
    • \( が続かない')

文字列全体に一致させたい場合は、文字列の^開始$マーカーと文字列の終了マーカーを使用します。

/^'(?:[^'\\]|\\'|\\(?!'))*'$/

... は一致'string'します'string\'s are awesome'が、'string's are awesome'または'string's

于 2012-12-10T11:26:49.460 に答える
0

そんなに難しくない…

また、エスケープせずに行を改行するなど\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|\\\\)*'$/ ));
  1. ^次の条件が文字列の先頭と一致する必要があることをマッチャーに伝える
  2. ''区切り文字に一致します
  3. (グループを開く
  4. [^\\'\n\r]\and以外のものに一致し、特殊文字および文字'には一致しません\n\r
  5. |上記の条件が何も一致しなかった場合、右側|がテストされます
  6. \\'一致します\'
  7. \\n\nリテラル文字列に一致します
  8. |\\r\rまたはリテラル文字列に一致します
  9. |\\\\\\またはリテラル文字列に一致します
  10. )*グループを閉じて、複数回繰り返すことを許可し、存在しないことを許可します (たとえば、空の文字列)
  11. '最後の'区切り文字に一致します
  12. $これが文字列の and でなければならないことをマッチャーに伝える
于 2012-12-10T11:33:42.833 に答える
-2

これを試して

/^'([az]*(?:\')?[az])+'$/

ここで例を参照してください

str = 'abc\'de\'fg';

match = str.match(/^([a-z\\']+)$/g);

Firebug コンソールでテスト済み。エスケープ文字の有無にかかわらず動作します。

于 2012-12-10T11:27:26.547 に答える