""
文字列の周りを削除したいのですが。
たとえば、文字列が:の場合、"I am here"
出力のみを行いI am here
ます。
str = str.replace(/"/g,"");
str = str.replace(/^"|"$/g, '');
境界引用符を置き換えます。Mr_Greenの答えはグローバルにALL "
を置き換えます。これは良くないことです
""
文字列の周りを削除したいのですが。
たとえば、文字列が:の場合、"I am here"
出力のみを行いI am here
ます。
str = str.replace(/"/g,"");
str = str.replace(/^"|"$/g, '');
境界引用符を置き換えます。Mr_Greenの答えはグローバルにALL "
を置き換えます。これは良くないことです
回答:
仮定:
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)
です。substr
2つの引数が必要です。最初の引数は部分文字列が始まるオフセットで、2番目はその長さです。最後の文字は必要ないので、最初の文字よりも長くなるので、その長さはstr.length - 2
です。イージーピージー。
ヒント:
ルックアラウンドのアサーションの詳細は、こちらで見つけることが
できます。Regexは非常に便利で(IMOの楽しみです)、最初は少し困惑することがあります。ここにいくつかの詳細と問題に関するリソースへのリンクがあります。
まだ正規表現の使用に慣れていない場合は、次の使用を検討してください。
var noQuotes = someStr.split('"').join('');
文字列に多くの引用符がある場合、これは正規表現を使用するよりも速いかもしれません
文字列の先頭と末尾に1つの引用符(または他の任意の1文字)が含まれていることが保証されている場合は、削除する必要があります。
str = str.slice(1, -1);
slice
正規表現よりもはるかに少ないオーバーヘッドがあります。
<uri>
、リテラルはのように示される"literal"
)を処理する場合に必要な「クイック」操作の一種であるため、反対票を投じられたことに驚いた。これが賛成票です。;)
データを制御していて、二重引用符が文字列を囲んでいる(文字列内に表示されない)ことがわかっていて、文字列が整数である場合...
"20151212211647278"
または同様に、これは周囲の引用をうまく削除します
JSON.parse("20151212211647278");
普遍的な答えではありませんが、ニッチなニーズにはうまく対応しています
JSON.parse("20151212211647278dfvs");
SyntaxError: Unexpected token d in JSON at position 17
境界引用符のみを削除したい場合:
function stripquotes(a) {
if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
return a.substr(1, a.length-2);
}
return a;
}
この方法では、文字列がのように見えない場合は文字列に触れません"text in quotes"
。
a.charAt(x)
<ECMA5サポート(f.ex IE7)が必要な場合に使用します。
正規表現として表現する方が簡単な方法で問題を言い換えると、次のようになります。
ゼロまたは1つの先行二重引用符とゼロまたは1つの後続二重引用符の間に含まれる文字のサブストリングを取得します。
これを行う正規表現は次のとおりです。
var regexp = /^"?(.+?)"?$/;
var newStr = str.replace(/^"?(.+?)"?$/,'$1');
正規表現を分解する:
^"?
ゼロまたは1つの先行二重引用符の貪欲な一致"?$
ゼロまたは1つの末尾の二重引用符の貪欲な一致(.+?)
ターゲットとして含みます$1
。これは次の場合に戻りdelimited "string" here
ます:
str = "delimited "string" here" // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
これは動作します...
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"
文字列内のすべての二重引用符を削除する場合は、次を使用します
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