""
文字列の周りを削除したい。
たとえば、文字列が次の場合:"I am here"
のみを出力したいI am here
。
仮定:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
それはうまくいくはずです...(あなたの目標がすべての二重引用符を置き換えることである場合)。
仕組みは次のとおりです。
['"]
文字クラスで、一重引用符と二重引用符の両方に一致します。"
二重引用符のみに一致するようにこれを置き換えることができます。+
: 先行する char-class で定義された 1 つ以上の引用符、chars (オプション)g
:グローバルフラグ。これは、文字列全体に正規表現を適用するように JS に指示します。これを省略すると、単一の文字のみが置き換えられます。特定の文字列の周りの引用符を削除しようとしている場合 (つまりペアで) は、少し複雑になります。ルックアラウンド アサーションを使用する必要があります。
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 回以上を除くすべての文字に一致"
(?=")
: ゼロ幅 (キャプチャされていない場合) の正の先読みアサーション。"
前の一致は、その後にリテラルが続く場合にのみ有効です)
: キャプチャ グループを終了します。オープニング クロージングの間のすべてをキャプチャしました"
"
: 別のリテラル、リスト項目 1 を参照置換は です'$1'
。これは、最初にキャプチャされたグループへの後方参照[^" ]+
です。このパターンは、引用符とそれらの間の両方に一致しますが、引用符の間にあるものだけに置き換えて、効果的にそれらを削除します。
それがすることは->を-> にsome "string with" quotes
置き換えます。引用符がなくなり、仕事が終わりました。"string with"
string with
引用符が常に文字列の最初と最後にある場合は、これを使用できます。
str.replace(/^"(.+(?="$))"$/, '$1');
または、二重引用符と単一引用符の場合:
str.replace(/^["'](.+(?=["']$))["']$/, '$1');
inputremove "foo" delimiting "
を使用すると、出力は変更されませんが、入力文字列を に変更する"remove "foo" delimiting quotes"
と、remove "foo" delimiting quotes
as output になります。
説明:
^"
: 文字列の先頭^
と"
. 文字列が で始まらない場合"
、式はここですでに失敗しており、何も置き換えられません。(.+(?="$))
: 肯定先読みが true の場合、1 回以上の二重引用符を含むすべてに一致 (およびキャプチャ) します。(?="$)
: 正の先読みは上記とほとんど同じですが、文字列の最後で"
なければならないことを指定するだけです ( $
=== end)"$
: 末尾の引用符に一致しますが、キャプチャしません置換は前と同じ方法で行われます: 一致 (開始引用符と終了引用符を含む) をそれらの中にあるすべてのものに置き換えます。文字列全体を処理しているため、この式は 1 回しか適用されないため、(グローバル BTW の) フラグ
を省略したことに気付いたかもしれません。
ほぼ同じことを行う簡単な正規表現 (正規表現のコンパイル/適用方法には内部的な違いがあります) は次のようになります。g
someStr.replace(/^"(.+)"$/,'$1');
以前^"
と同様に"$
、文字列の先頭と末尾の区切り引用符に(.+)
一致し、その間のすべてに一致し、それをキャプチャします。上記の正規表現 (先読みアサーション付き) と一緒にこの正規表現を試してみましたが、驚いたことに、これは少し遅いことがわかりました。"
私の推測では、エンジンが文字列の末尾に何もないと判断するとすぐに、ルックアラウンド アサーションにより前の式が失敗します。ああ、でも、これがあなたが望む/必要としているものなら、読んでください:
ただし、この最後のケースでは、これを行う方がはるかに安全で、高速で、保守しやすく、優れています。
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
ここでは、文字列の最初と最後の文字が二重引用符であるかどうかを確認しています。もしそうなら、私はそれらの最初と最後の文字substr
を切り取るために使用しています. 文字列のインデックスはゼロなので、最後の文字はcharAt(str.length -1)
. substr
最初の引数は部分文字列が開始するオフセットで、2 番目はその長さです。最初の文字よりも最後の文字が必要ないため、その長さはstr.length - 2
. イージーピージー。
ヒント:
ルックアラウンドアサーションの詳細については、ここで見つけることが
できます。正規表現は非常に便利です (そして IMO は楽しい)。詳細と、この問題に関するリソースへのリンクを次に示します。
まだ正規表現の使用に慣れていない場合は、次の使用を検討してください。
var noQuotes = someStr.split('"').join('');
文字列に多くの引用符がある場合、これは正規表現を使用するよりも高速である可能性があります
データを制御でき、二重引用符で文字列を囲み (文字列内に表示しないでください)、文字列が整数であることがわかっている場合は、次のように言います:
"20151212211647278"
または同様に、これは周囲の引用符をうまく削除します
JSON.parse("20151212211647278");
普遍的な答えではありませんが、ニッチなニーズには巧妙です
境界の引用符のみを削除する場合:
function stripquotes(a) {
if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
return a.substr(1, a.length-2);
}
return a;
}
のように見えない場合、このアプローチは文字列に触れません"text in quotes"
。
先頭または末尾の引用符のみを削除する場合は、次の正規表現を使用します。
'"Hello"'.replace(/(^"|"$)/g, '');
正規表現として表現しやすい方法で問題を言い換えるには:
ゼロまたは 1 つの先頭の二重引用符とゼロまたは 1 つの末尾の二重引用符の間に含まれる文字の部分文字列を取得します。
これを行う正規表現は次のとおりです。
var regexp = /^"?(.+?)"?$/;
var newStr = str.replace(/^"?(.+?)"?$/,'$1');
正規表現を分解する:
^"?
先頭の二重引用符が 0 個または 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));
文字列内のすべての二重引用符を削除する場合は、使用します
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