148

" It's big \"problem "正規表現を使用して部分文字列を取得するにはどうすればよいですか?

s = ' function(){  return " It\'s big \"problem  ";  }';     
4

16 に答える 16

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

The Regex Coach および PCRE Workbench で動作します。

JavaScript でのテストの例:

    var s = ' function(){ return " Is big \\"problem\\", \\no? "; }';
    var m = s.match(/"(?:[^"\\]|\\.)*"/);
    if (m != null)
        alert(m);

于 2008-10-30T11:59:45.580 に答える
37

これは、多くの Linux ディストリビューションで利用可能な nanorc.sample からのものです。Cスタイルの文字列の構文強調表示に使用されます

\"(\\.|[^\"])*\"
于 2009-06-19T04:34:19.687 に答える
22

ePharaoh によって提供されるように、答えは

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

上記を一重引用符または二重引用符で囲まれた文字列に適用するには、次を使用します

/"([^"\\]*(\\.[^"\\]*)*)"|\'([^\'\\]*(\\.[^\'\\]*)*)\'/
于 2012-05-28T14:12:19.030 に答える
11

ここで提供されるソリューションのほとんどは、代替の繰り返しパス、つまり (A|B)* を使用します。

一部のパターン コンパイラは再帰を使用してこれを実装しているため、大きな入力でスタック オーバーフローが発生する可能性があります。

Java の例: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6337993

次のようなもの: "(?:[^"\\]*(?:\\.)?)*"、または Guy Bedford によって提供されたものは、解析ステップの量を減らし、ほとんどのスタック オーバーフローを回避します。

于 2015-06-09T16:02:06.293 に答える
9
"(?:\\"|.)*?"

\"エスケープされた引用符の上にと を交互に.渡すことで、遅延量指定子*?により、引用符で囲まれた文字列の末尾を超えないようにします。.NET Framework RE クラスで動作

于 2010-12-15T08:54:58.877 に答える
9
/(["\']).*?(?<!\\)(\\\\)*\1/is

引用符付きの文字列で動作するはずです

于 2008-10-30T10:58:32.710 に答える
8
/"(?:[^"\\]++|\\.)*+"/

man perlrePerl 5.22.0 がインストールされた Linux システムから直接取得。+最適化として、この正規表現は両方の'posessive' 形式を使用して*バックトラッキングを防ぎます。これは、閉じ引用符のない文字列はいずれの場合も一致しないことが事前にわかっているためです。

于 2015-11-09T20:38:52.257 に答える
0

regexps はすべての string-y に対する特効薬ではないことを覚えておく必要があります。いくつかのことは、カーソルと線形、手動、シークを使用する方が簡単です。CFLを使えば簡単にこのトリックを実行できますが、CFL の実装はあまり多くありません (私の知る限り)。

于 2008-10-30T11:18:23.153 に答える
0
于 2013-12-03T13:36:39.243 に答える
0

最初から検索すれば、これでうまくいくかも?

\"((\\\")|[^\\])*\"
于 2013-04-10T21:14:32.603 に答える
-1

正規表現をいじって、この正規表現で終わりました:(それがどのように機能するかを私に聞かないでください、私はそれを書いたとしてもほとんど理解していません笑)

"(([^"\\]?(\\\\)?)|(\\")+)+"
于 2014-09-20T22:54:39.573 に答える