web-dev-qa-db-ja.com

文字列から二重引用符を削除したい

文字列の周りの""を削除したいです。

例えば文字列が"I am here"であれば、I am hereだけを出力したいです。

177
ankur

と仮定します。

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

これでうまくいくでしょう...(あなたの目的がall二重引用符を置き換えることである場合)。

これがどのように動作するのかです:

  • ['"]は文字クラスで、一重引用符と二重引用符の両方に一致します。これを"に置き換えて二重引用符のみを一致させることができます。
  • +:前のchar-classで定義されている1つ以上の引用符、chars(オプション)
  • gglobalフラグこれはJSに正規表現を文字列全体に適用するように伝えます。これを省略すると、1つの文字のみが置き換えられます。

あなたが与えられた文字列の周りの引用符を削除しようとしているならば(すなわちペアで)、事は少しトリッキーになります。ルックアサーションアサーションを使用する必要があります。

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed

正規表現は説明した:

  • ":literal、任意のリテラルに一致"
  • (:グループの捕獲を始めます。括弧(())の間にあるものは何でもキャプチャされ、置換値に使用することができます。
  • [^"]+:文字クラス。all charsと一致します。ただし、"は1回以上
  • (?="):幅0(キャプチャされていない場合と同様)のポジティブルックアヘッドアサーション。前回の一致は、それに"リテラルが続く場合にのみ有効です。
  • ):グループのキャプチャを終了しました、オープニングとクロージングの間のすべてをキャプチャしました"
  • ":別のリテラル、cfリスト項目1

置き換えは'$1'で、これは最初のキャプチャされたグループへの逆参照、[^" ]+、または二重引用符の間のすべてです。パターンは、引用符とその間にあるものの両方に一致しますが、引用符とその間にあるものにのみ置き換えられ、効果的にそれらが削除されます。
それがすることはsome "string with" quotes - >が"string with"を - > string withに置き換えることです。引用符は消えた、仕事は終わった。

引用符がalwaysで始まっていて文字列の終わりにある場合は、これを使用できます。

str.replace(/^"(.+(?="$))"$/, '$1');

Input remove "foo" delimiting "の場合、出力は変更されませんが、入力文字列を"remove "foo" delimiting quotes"に変更すると、出力としてremove "foo" delimiting quotesが生成されます。

説明:

  • ^":文字列^および"の先頭に一致します。文字列が"で始まっていない場合、式はすでにここで失敗し、何も置き換えられません。
  • (.+(?="$)):二重引用符を含むすべてのものに1回以上一致(および取り込み)します。ただし、肯定的な先読みが真の場合
  • (?="$):正の先読みは上記とほぼ同じですが、"mustが文字列の末尾であることを指定するだけです($ === end)
  • "$:その終了引用符に一致しますが、それをキャプチャーしません

置き換えは以前と同じ方法で行われます。マッチ(開始と終了の引用符を含む)を、それらの内側にあるものすべてに置き換えます。
gフラグを省略したことに気付いたかもしれません(グローバルBTWの場合)。文字列全体を処理しているので、この式は1回だけ適用されるためです。
ほぼ同じことをする簡単な正規表現(正規表現のコンパイル方法と適用方法には内部的な違いがあります)は次のようになります。

someStr.replace(/^"(.+)"$/,'$1');

^""$は文字列の始めと終わりの区切りの引用符にマッチし、(.+)はその間のすべてにマッチし、それをキャプチャします。私は上のものと並んで(先読みアサーションで)この正規表現を試してみました、そして、確かに、私のサプライズにはこれがわずかに遅いことがわかりました。エンジンが文字列の最後に"がないと判断するとすぐに、ルックアラウンドアサーションによって前の式が失敗すると私は思います。ああ、でもこれがあなたが欲しい/必要なものなら、読んでください

ただし、この最後のケースでは、はるかに安全で、高速で、保守性がよく、これを実行することをお勧めします。

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

ここでは、文字列の最初と最後の文字が二重引用符であるかどうかを確認しています。もしそうであれば、私はsubstrcut off _それらの最初と最後の文字に使います。文字列はインデックスが0であるため、最後の文字はcharAt(str.length -1)です。 substrは2つの引数を取ります。最初の引数はサブストリングの開始位置からのオフセット、2番目の引数はその長さです。最後の文字が欲しくないので、最初の文字が欲しい以上に、その長さはstr.length - 2です。やさしい。

ヒント

ルックアサーションアサーションの詳細 ここで見つけることができます
Regexはとても便利(そしてIMOが楽しい)、最初は少し面倒かもしれません。 ここでいくつかの詳細とリソースへのリンクがあります 問題に関して。
正規表現をまだあまり使い慣れていない場合は、次のものを使用することを検討してください。

var noQuotes = someStr.split('"').join('');

文字列に引用符がたくさんある場合、これは正規表現を使うよりも速いかもしれません。

313
str = str.replace(/^"(.*)"$/, '$1');

この正規表現は、文字列の最初と最後の文字である場合にのみ引用符を削除します。 F.ex:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)
67
David Hellsing

文字列が最初と最後に一重引用符(または他の任意の1文字)を含むことが保証されている場合は、削除します。

str = str.slice(1, -1);

sliceは、正規表現よりもはるかに少ないオーバーヘッドです。

32
darrinm

データを管理していて、二重引用符が文字列を囲んでいることがわかっている場合(つまり、文字列の内側には表示されません)、文字列は整数です。

"20151212211647278"

またはこれと同様に、これは周囲の引用符をきれいに削除します

JSON.parse("20151212211647278");

普遍的な答えではありませんが、ニッチなニーズには滑らか

27
Scott Stensland

境界引用符だけを削除したい場合は、次のようにします。

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

"text in quotes"のように表示されない場合、このアプローチは文字列に触れません。

10
Kos

最初または最後から引用符を削除するだけの場合は、次の正規表現を使用してください。

'"Hello"'.replace(/(^"|"$)/g, '');
7
Denis

正規表現として表現するのが簡単な方法であなたの問題を言い直すには:

0個または1個の先行二重引用符と0個または1個の後続二重引用符の間に含まれる文字のサブストリングを取得します。

これを行う正規表現は次のとおりです。

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');

正規表現を分解する:

  • ^"?ゼロまたは1つの先行二重引用符に対する欲張りな一致
  • "?$ゼロまたは1つの末尾の二重引用符に対する欲張りな一致
  • これら2つは、(.+?)としてターゲットを含む、他のすべての文字$1の貪欲な捕獲を促進します。

これはdelimited "string" hereを返します。

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
5
Mogsdad

怠惰な人々のためのワンライナー

var str = '"a string"';
str = str.replace(/^"|"$/g, '');
4
Kolob Canyon

文字列内の二重引用符をすべて削除したい場合は、

var str = '"some "quoted" string"';
console.log( str.replace(/"/g, '') );
// some quoted string

それ以外の場合は、文字列の前後の引用符だけを削除したい場合は、次のようにします。

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string
1
balkon_smoke

この単純なコードでも、二重引用符で囲まれた文字列から二重引用符などを削除することができます。

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));
0
Amaynut

これは動作します...

var string1 = "'foo'";
var string2 = '"bar"';

function removeFirstAndLastQuotes(str){
  var firstChar = str.charAt(0);
  var lastChar = str[str.length -1];
  //double quotes
  if(firstChar && lastChar === String.fromCharCode(34)){
    str = str.slice(1, -1);
  }
  //single quotes
  if(firstChar && lastChar === String.fromCharCode(39)){
    str = str.slice(1, -1);
  }
  return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));
0
Ron Royston
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

これはあなたのために働くかもしれません。

0
Splinker P