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


238

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

たとえば、文字列が:の場合、"I am here"出力のみを行いI am hereます。


4
単にstring.replace( '"'、 '')を使用しないのはなぜですか
Adarsh Kumar

69
str = str.replace(/"/g,"");
Mr_Green 2013年

11
すべての引用符または境界引用符を削除しますか?
Kos

36
stackoverflow.com/q/19155566/989121。ASCII文字ごとに1回ずつ、255の質問をしますか?
georg 2013年

6
str = str.replace(/^"|"$/g, '');境界引用符を置き換えます。Mr_Greenの答えはグローバルにALL "を置き換えます。これは良くないことです
Kolob Canyon

回答:


387

仮定:

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

これでうまくいくはずです(すべての二重引用符を置き換えることが目的の場合)。

仕組みは次のとおりです。

  • ['"]文字クラスで、一重引用符と二重引用符の両方に一致します。"二重引用符のみに一致するようにこれを置き換えることができます。
  • +:1つ以上の引用符、文字、前の文字クラスで定義されたもの(オプション)
  • gグローバルフラグ。これは、正規表現を文字列全体に適用するように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

正規表現は説明しました:

  • ":リテラル、任意のリテラルに一致 "
  • (:グループのキャプチャを開始します。括弧(())の間にあるものがキャプチャされ、置換値で使用できます。
  • [^"]+:文字クラス、1回以上を除くすべての文字に一致"
  • (?="):ゼロ幅(キャプチャされていない場合と同様)の先読みアサーション。以前の一致は、"リテラルが後に続く場合にのみ有効になります
  • ):キャプチャグループを終了し、オープニングクロージングの間のすべてをキャプチャしました "
  • ":別のリテラル、cfリスト項目1

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

引用符が常に文字列の最初と最後にある場合は、次のように使用できます。

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

inputを使用するremove "foo" delimiting "と、出力は変更されませんが、入力文字列はに変更され"remove "foo" delimiting quotes"、最終的にはremove "foo" delimiting quotesとして出力されます。

説明:

  • ^":文字列の先頭^とaに一致し"ます。文字列がで始まらない場合、"式は既にここで失敗し、何も置換されません。
  • (.+(?="$)):肯定的な先読みがtrueの場合、二重引用符を含めてすべてに一致(およびキャプチャー)します。
  • (?="$):正の先読みは上記とほとんど同じですが、それが文字列の最後で" なければならないことを指定しているだけです($=== end)
  • "$:最後の引用符に一致しますが、キャプチャしません

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

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

^"と同じように"$、文字列の最初と最後の区切り引用符を(.+)照合し、はその間のすべてを照合し、それをキャプチャします。私はこの正規表現を(先読みアサーションで)上記の正規表現と一緒に試してみましたが、確かに、驚いたことに、この正規表現は少し遅いことがわかりました。推測では"、文字列の最後に存在しないとエンジンが判断するとすぐに、lookaroundアサーションによって前の式が失敗します。ああ、でもこれがあなたが望む/必要なものであるなら、読んでください:

ただし、この最後のケースでは、これを行う方がはるかに安全で、高速で、保守性が高く、優れています。

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

ここでは、文字列の最初と最後の文字が二重引用符であるかどうかを確認しています。もしそうなら、私はそれらの最初と最後の文字substr切り捨てるために使用しています。文字列はインデックスがゼロであるため、最後の文字はcharAt(str.length -1)です。substr2つの引数が必要です。最初の引数は部分文字列が始まるオフセットで、2番目はその長さです。最後の文字は必要ないので、最初の文字よりも長くなるので、その長さはstr.length - 2です。イージーピージー。

ヒント

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

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

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


1
@rid:編集して、式の機能とそのカスタマイズ方法について少し説明しました
エリアスヴァンウーテゲム2013年

83
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)

63

文字列の先頭と末尾に1つの引用符(または他の任意の1文字)が含まれていることが保証されている場合は、削除する必要があります。

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

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


8
なぜ反対票?'"私はここにいる"' .slice(1、-1)-> '私はここにいる'!
darrinm

2
これは、RDFリテラル(たとえば、URIは通常のように示され<uri>、リテラルはのように示される"literal")を処理する場合に必要な「クイック」操作の一種であるため、反対票を投じられたことに驚いた。これが賛成票です。;)
Mark Birbeck

2
(特に、元の質問が文字列を囲む引用符を削除することを望んでいるためです。)
Mark Birbeck

2
これは、求められていることを正確に実行し、効率的に実行するため、受け入れられる答えになるはずです。
Pascal

38

データを制御していて、二重引用符が文字列を囲んでいる(文字列内に表示されない)ことがわかっていて、文字列が整数である場合...

"20151212211647278"

または同様に、これは周囲の引用をうまく削除します

JSON.parse("20151212211647278");

普遍的な答えではありませんが、ニッチなニーズにはうまく対応しています


これはFireFoxで次のエラーが発生します:SyntaxError:JSON.parse:JSONデータの1行1列1で予期しない文字
Ben Pretorius

いいえ...現在のFireFoxの最新リリースでは問題なく機能します
Scott Stensland

JSON.parse( "{123123}"); これはあなたの答えを吹き飛ばします
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Systems Rebooter 2017年


16

境界引用符のみを削除したい場合:

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

この方法では、文字列がのように見えない場合は文字列に触れません"text in quotes"


2
a.charAt(x)<ECMA5サポート(f.ex IE7)が必要な場合に使用します。
David Hellsing 2013年

8

先頭または末尾から引用符のみを削除する場合は、次の正規表現を使用します。

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

1
これも変更するであろう注意してください"foofoo"。これらのペア全体をドロップしたいだけかもしれません。
Kos

メモをありがとう、私はそれが予想された動作であると思ったけれども。
Denis

5

正規表現として表現する方が簡単な方法で問題を言い換えると、次のようになります。

ゼロまたは1つの先行二重引用符とゼロまたは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

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

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

これが最も適切な答えです。/"/gは動作しません"My name is \"Jason\""
Jason Liu

この答えは削除され、すべての場合には良くありません最初と最後で引用、" - is a quoteそれは同じではありませんので、文字列をまわり
vladkras

2

これは動作します...

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));


コードが間違っています。空の文字列の入力を試してみてください、またはしようと'foo"単にまたはfoo"
パヴェル・P

1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

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


0

文字列内のすべての二重引用符を削除する場合は、次を使用します

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

0

この単純なコードも機能し、たとえば二重引用符で囲まれた文字列から二重引用符を削除します。

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

0

二重引用符を削除しようとしている場合は、以下を試してください

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);

0

このコードは、テキストボックスの番号を表示するのに非常に適しています

$(this)= [あなたのテキストボックス]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"

-2

stringから二重引用符を削除するには、次の正規表現を試してください。

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();

2
彼らはJavaScriptソリューションを求めています!
トト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.