-1

引用符 (") で囲まれた文字列を抽出するために書いています。jquery で以下のステートメントを使用して取得します。

var item = objstr.match(/\"(([^\"])*)\"/g);

しかし、\" を例外として許可したいと考えています。

4

3 に答える 3

2

この正規表現は、先読みまたは後読みを使用せずに同様に機能する可能性があります: (スペースを削除してください!)

/" (\\\\ | \\" | [^"])* "/

読み取り: 二重引用符から二重引用符までの文字列に一致します。\\間には、エスケープされたバックスラッシュ、エスケープされた二重引用符\"、または引用符以外の文字が何もないか、組み合わせてある場合があります。これにより、次のような入力が可能になります

"abc\\abc\abc\"abc\\\"abc"

有効ですが、そうではありません

"abc\\"abc"
//    ^ String terminates here

文字列にエスケープされていない意味がある場合は、それが必要になる場合があります\"

@nickb からの回答には、この機能/バグはありません。彼の正規表現では両方の文字列が有効です。

正規表現エンジンがbacktrackingをオフにできる場合は、これを使用するときです。Perl では、量指定子に a を追加する+必要があります (または難解なブランチのリセットに切り替えます)。何が必要なのかわからない。

/" (\\\\ | \\" | [^"])*+ "/

また、貪欲な動作が必要*?なため、構成要素はありません。

于 2012-08-01T23:40:57.420 に答える
1

http://writecodeonline.com/javascript/から次のコードをテストしました。

var s = "wwww\"ooxx\\\"xyz\"";
var foo = s.match(/"(?:[^\\"]|\\.)*"/);
document.write(foo[0]);     
于 2012-08-02T00:07:15.290 に答える
0

この質問は何度も出題されており、常に同じ明らかな、しかし間違った回答が引き出されます。;)

否定的な後読みアプローチ -- (?<!\\)"-- は、エスケープされたバックスラッシュを考慮できないため、機能しません。質問で言及されていないことは知っていますが、ソーステキストが引用符をエスケープするためにバックスラッシュを使用している場合は、特に言わない限り、バックスラッシュを使用して他のバックスラッシュもエスケープしていると想定する必要があります。

代替アプローチ -- "(?:[^\\"]|\\.)*"-- エスケープされたバックスラッシュを扱いますが、正しくありません。別の選択肢を追加しても -- "(\\\\|\\"|[^"])*"-- 修正されません。有効な入力に一致しますが、次のような不正な形式の文字列が与えられます:

"escaped \"quotes\" but no ending quote

...失敗した一致を報告する代わりに、これは誤って一致します:

"escaped \"quotes\"

RegexBuddy のライブラリにあり、The Bookで説明されているように、これが最良のアプローチです。

/"[^"\\]*(?:\\.[^"\\]*)*"/g

一致する文字列に行区切り文字 (Java 文字列リテラルなど) を含めない場合は、次を使用します。

/"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"/g

他のアプローチも可能ですが、これには 3 つの大きな利点があります。非常に効率的です。また、高度な機能に依存しません。つまり、Perl 由来の正規表現フレーバーの赤い頭の継子である JavaScript でも機能します。:D

于 2012-08-02T01:39:37.757 に答える