web-dev-qa-db-ja.com

文字列を囲む特定の文字を削除する方法は?

私はこの文字列を持っています:

var str = "? this is a ? test ?";

今、私はこれを取得したい:

var newstr = "this is a ? test";

ご覧のとおり、(先頭と末尾)その文字列(文字列の途中ではない)を囲む?だけを削除したいと思います。 JavaScriptを使用してこれを行うにはどうすればよいですか?

ここに私が試したものがあります:

var str = "? this is a ? test ?";
var result = str.trim("?");
document.write(result);

したがって、ご覧のとおり、機能しません。実際、私はPHP開発者で、 trim()はPHPでうまく機能します です。trim()を使用できるかどうかを知りたいJSでそれを行うには。


正規表現を使用してそれを行うことができます に注意する必要がありますが、正直に言うと、この種のジョブの正規表現は嫌いです。とにかくより良い解決策はありますか?


Edit:これはコメントで述べたように、文字列の周りにある?と空白の両方を削除する必要があります。

13
Shafizadeh

文字マスクを検索し、残りを返さずに返します。

この提案では、チェックに bitwise not~演算子を使用しています。

~bitwise not演算子 です。 indexOf() との使用に最適です。なぜなら、indexOfは、インデックス0 ... nが見つかった場合とそうでない場合は-1を返すためです。

value  ~value   boolean
 -1  =>   0  =>  false
  0  =>  -1  =>  true
  1  =>  -2  =>  true
  2  =>  -3  =>  true
  and so on 
function trim(s, mask) {
    while (~mask.indexOf(s[0])) {
        s = s.slice(1);
    }
    while (~mask.indexOf(s[s.length - 1])) {
        s = s.slice(0, -1);
    }
    return s;
}

console.log(trim('??? this is a ? test ?', '? '));
console.log(trim('abc this is a ? test abc', 'cba '));
12
Nina Scholz

可能な解決策は、再帰関数を使用して、不要な先頭文字と末尾文字を削除することです。これは正規表現を使用しません。

function ltrim(char, str) {
    if (str.slice(0, char.length) === char) {
        return ltrim(char, str.slice(char.length));
    } else {
        return str;
    }
}

function rtrim(char, str) {
    if (str.slice(str.length - char.length) === char) {
        return rtrim(char, str.slice(0, 0 - char.length));
    } else {
        return str;
    }
}

もちろん、これは多くの可能な解決策の1つにすぎません。関数trimは、ltrimrtrimの両方を使用します。

charが最初の引数であり、2番目の引数を削除する必要がある文字列である理由は、これを関数型プログラミングスタイル関数に簡単に変更できるようにするためです(ES 2015)。

function ltrim(char) {
    (str) => {
        <body of function>
    }
}

// No need to specify str here
function ltrimSpaces = ltrim(' ');
6
Arjan

単に使用します:

let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')

console.log(text)
4
Michal Karzel

範囲外のインデックスをチェックし、substringを1回だけ呼び出す、それを行う1つの方法を次に示します。

String.prototype.trimChars = function(chars) {
  var l = 0;
  var r = this.length-1;
  while(chars.indexOf(this[l]) >= 0 && l < r) l++;
  while(chars.indexOf(this[r]) >= 0 && r >= l) r--;
  return this.substring(l, r+1);
};

例:

var str = "? this is a ? test ?";

str.trimChars(" ?");  // "this is a ? test"
3
ericman314

Array.indexOfArray.lastIndexOf、およびArray.slice関数を使用した簡単なアプローチ:

更新:(注:著者はsurrounding charsのトリミングを要求しました)

function trimChars(str, char){
    var str = str.trim();

    var checkCharCount = function(side) {
        var inner_str = (side == "left")? str : str.split("").reverse().join(""),
            count = 0;

        for (var i = 0, len = inner_str.length; i < len; i++) {
            if (inner_str[i] !== char) {
                break;
            }
            count++;
        }
        return (side == "left")? count : (-count - 1);
    };

    if (typeof char === "string" 
            && str.indexOf(char) === 0
            && str.lastIndexOf(char, -1) === 0) {
        str = str.slice(checkCharCount("left"), checkCharCount("right")).trim();
    }

    return str;
}

var str = "???? this is a ? test ??????";

console.log(trimChars(str, "?"));   // "this is a ? test"
3
RomanPerekhrest

正規表現なし:

uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
  s.slice(1, -1).trim() 
  : s;

段階的な説明:

  1. 文字列の長さが2文字以上であり、特定の文字で囲まれているかどうかを確認します。
  2. 含まれている場合は、まずスライスして周囲の文字を削除し、次にトリミングして空白を削除します。
  3. 返さない場合。

その構文でおかしくなったら、それは 矢印関数三項演算子 です。
ちなみに、括弧は三項では不要です。

使用例:

uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
3
Paul Stenne

eS6アプローチを使用してこの質問を最新の状態に保つには:

私はビット単位の方法が好きでしたが、読みやすさも懸念される場合、別のアプローチがあります。

function trimByChar(string, character) {
  const first = [...string].findIndex(char => char !== character);
  const last = [...string].reverse().findIndex(char => char !== character);
  return string.substring(first, string.length - last);
}
2
Robin F.

Javascriptのtrimメソッドは空白のみを削除し、パラメーターを取りません。カスタムトリムの場合、独自の機能を作成する必要があります。正規表現はそれに対する迅速な解決策となり、正規表現の作成プロセスを経るのが面倒にならないように w3schools でカスタムトリムの実装を見つけることができます。 (空白の代わりにフィルタリングするために調整する必要がありますか?

1
Bettorun

正規表現を使用する

'? this is a ? test ?'.replace(/^[? ]*(.*?)[? ]*$/g, '$1')

あなたは正規表現を嫌うかもしれませんが、解決策を見つけた後、あなたはクールに感じるでしょう:)

0
Anupam Ghosh