" It's big \"problem "
正規表現を使用して部分文字列を取得するにはどうすればよいですか?
s = ' function(){ return " It\'s big \"problem "; }';
/"(?:[^"\\]|\\.)*"/
The Regex Coach および PCRE Workbench で動作します。
JavaScript でのテストの例:
var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
var m = s.match(/"(?:[^"\\]|\\.)*"/);
if (m != null)
alert(m);
これは、多くの Linux ディストリビューションで利用可能な nanorc.sample からのものです。Cスタイルの文字列の構文強調表示に使用されます
\"(\\.|[^\"])*\"
ePharaoh によって提供されるように、答えは
/"([^"\\]*(\\.[^"\\]*)*)"/
上記を一重引用符または二重引用符で囲まれた文字列に適用するには、次を使用します
/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
ここで提供されるソリューションのほとんどは、代替の繰り返しパス、つまり (A|B)* を使用します。
一部のパターン コンパイラは再帰を使用してこれを実装しているため、大きな入力でスタック オーバーフローが発生する可能性があります。
Java の例: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993
次のようなもの:
"(?:[^"\\]*(?:\\.)?)*"
、または Guy Bedford によって提供されたものは、解析ステップの量を減らし、ほとんどのスタック オーバーフローを回避します。
"(?:\\"|.)*?"
\"
エスケープされた引用符の上にと を交互に.
渡すことで、遅延量指定子*?
により、引用符で囲まれた文字列の末尾を超えないようにします。.NET Framework RE クラスで動作
/(["\']).*?(?<!\\)(\\\\)*\1/is
引用符付きの文字列で動作するはずです
/"(?:[^"\\]++|\\.)*+"/
man perlre
Perl 5.22.0 がインストールされた Linux システムから直接取得。+
最適化として、この正規表現は両方の'posessive' 形式を使用して*
バックトラッキングを防ぎます。これは、閉じ引用符のない文字列はいずれの場合も一致しないことが事前にわかっているためです。
regexps はすべての string-y に対する特効薬ではないことを覚えておく必要があります。いくつかのことは、カーソルと線形、手動、シークを使用する方が簡単です。CFLを使えば簡単にこのトリックを実行できますが、CFL の実装はあまり多くありません (私の知る限り)。
最初から検索すれば、これでうまくいくかも?
\"((\\\")|[^\\])*\"
正規表現をいじって、この正規表現で終わりました:(それがどのように機能するかを私に聞かないでください、私はそれを書いたとしてもほとんど理解していません笑)
"(([^"\\]?(\\\\)?)|(\\")+)+"