web-dev-qa-db-ja.com

文字列から特定の文字を切り取る

このC#メソッドに相当するJavaScriptとは何ですか:

var x = "|f|oo||"; 
var y = x.Trim('|'); //  "f|oo"

C#は、文字列のbeginningおよびendでのみ選択した文字をトリミングします!

75
fubo

1行で十分です:

var x = '|f|oo||';
var y = x.replace(/^\|+|\|+$/g, '');
document.write(x + '<br />' + y);
^\|+   beginning of the string, pipe, one or more times
|      or
\|+$   pipe, one or more times, end of the string

関数内:

function trim (s, c) {
  if (c === "]") c = "\\]";
  if (c === "\\") c = "\\\\";
  return s.replace(new RegExp(
    "^[" + c + "]+|[" + c + "]+$", "g"
  ), "");
}

s = ".foo..oo...";
console.log(s, "->", trim(s, "."));
s = "|foo||oo|||";
console.log(s, "->", trim(s, "|"));
s = "]foo]]oo]]]";
console.log(s, "->", trim(s, "]"));
s = "\\foo\\\\oo\\\\\\";
console.log(s, "->", trim(s, "\\"));
92
leaf

私がよく理解している場合、特定の文字を削除するのは、文字列の先頭または末尾にある場合のみです(例:||fo||oo||||foo||ooになります)。次のようにアドホック関数を作成できます。

function trimChar(string, charToRemove) {
    while(string.charAt(0)==charToRemove) {
        string = string.substring(1);
    }

    while(string.charAt(string.length-1)==charToRemove) {
        string = string.substring(0,string.length-1);
    }

    return string;
}

以下のコードでこの機能をテストしました。

var str = "|f|oo||";
$( "#original" ).html( "Original String: '" + str + "'" );
$( "#trimmed" ).html( "Trimmed: '" + trimChar(str, "|") + "'" );
29
Pho3niX83

次のような正規表現を使用できます。

var x = "|f|oo||";
var y = x.replace(/^[\|]+|[\|]+$/g, "");
alert(y); // f|oo

更新:

これを関数に一般化したい場合は、次のことができます。

var escapeRegExp = function(strToEscape) {
    // Escape special characters for use in a regular expression
    return strToEscape.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};

var trimChar = function(origString, charToTrim) {
    charToTrim = escapeRegExp(charToTrim);
    var regEx = new RegExp("^[" + charToTrim + "]+|[" + charToTrim + "]+$", "g");
    return origString.replace(regEx, "");
};

var x = "|f|oo||";
var y = trimChar(x, "|");
alert(y); // f|oo
13
neelsg

この質問を最新に保つには:

ここでは、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);
}
12
Robin F.

これにより、一度に複数の文字をトリミングできます。

String.prototype.trimChars = function (c) {
  var re = new RegExp("^[" + c + "]+|[" + c + "]+$", "g");
  return this.replace(re,"");
}

var x = "|f|oo||"; 
x =  x.trimChars('|'); // f|oo

var y = "..++|f|oo||++..";
y = y.trimChars('|.+'); // f|oo

var z = "\\f|oo\\"; // \f|oo\

// For backslash, remember to double-escape:
z = z.trimChars("\\\\"); // f|oo
6
marlar

正規表現は、Trimのような単純な問題には少し複雑すぎるように思えますか?

C#

var x = "|f|oo||"; 
var y = x.Trim('|'); //  "f|oo"

Javascript、x.TrimLeft( '|')の例-シンプル(ただし、1文字のみをトリミング)

var ltrim = "|";
var x = "|f|oo||";
var y = (x.startsWith(ltrim) ? x.substring(ltrim.length) : x); // "f|oo||"

var result = y;
console.log(y);

Javascriptの完全な例(@Toboの回答と@roobyの提案に感謝)

class SutString extends String { // [S]tring[Ut]ility
  replaceFirstOnly(src, dest) {
    return new SutString(this.replace(src, dest)); // String.replace is misleading
  }
  replaceAll(src, dest) {
    return new SutString(this.split(src).join(dest));
  }

  reverse() {
    return new SutString(this.split("").reverse().join(""));
  }

  trimStart(delimiter = " ") {
    if (!delimiter) {
      return this.replace(/^\s+/gm, '');
    }

    var current = this; var index = this.length;
    while(current.startsWith(delimiter) && index >= 0) {
      current = current.substring(delimiter.length);
      --index;
    }
    if (typeof(current) === 'string') {
      return new SutString(current);
    }
    return current;
  };

  trimEnd(delimiter = " ") {
    if (!delimiter) {
      return new SutString(this.reverse().replace(/^\s+/gm, '')).reverse();
    }

    var current = this; var index = this.length;
    while(current.endsWith(delimiter) && index >= 0) {
      current = current.substring(0, this.length - delimiter.length - 1);
      --index;
    }
    if (typeof(current) === 'string') {
      return new SutString(current);
    }
    return current;
  };

  trimString(delimiter = " ") {
    if (!delimiter) {
      return this.trim();
    }

    return this.trimStart(delimiter).trimEnd(delimiter);
  };
}
// Pushes all functions and properties from String to SutString,
//   returning SutString if the result is a string
for(let prop of Object.getOwnPropertyNames(String.prototype)) {
  if (prop === "constructor" || prop === "toString" || (""[prop]) instanceof Function) {
    continue;
  }
  let newprop = prop;
  if (typeof(SutString.prototype[prop]) !== 'undefined') {
    newprop = "base_" + prop;
  }
  SutString.prototype[newprop] = function() {
    const result = this.toString()[prop].apply(this, arguments);
    if (typeof(result) !== 'string') {
      return result;
    }
    return new SutString(result);
  }
}
var str = new SutString("|f|oo||");
var strWhitespace = new SutString(" |f|oo||  ");

console.log("/*" + str.trimStart("|") + "*/", "\"" + str + "\".trimStart(\"|\");");
console.log("/*" + str.trimEnd("|") + "*/", "\"" + str + "\".trimEnd(\"|\");");
console.log("/*" + str.trimString("|") + "*/", "\"" + str + "\".trimString(\"|\");");

console.log("/*" + strWhitespace.trimStart() + "*/", "\"" + strWhitespace + "\".trimStart();");
console.log("/*" + strWhitespace.trimEnd() + "*/", "\"" + strWhitespace + "\".trimEnd();");
console.log("/*" + strWhitespace.trimString() + "*/", "\"" + strWhitespace + "\".trimString();");

私は、trimStartとtrimEndを少し怠けていました。各サイドのどれだけをトリミングする必要があるかを見つける方が効率的です。次に、部分文字列を1回だけ呼び出します。しかし、うまくいけばアイデアが得られ、これが役立つことを期待しています!

注:これはes6固有です。この一部はes2019で実装されます。

3
TamusJRoyce

目に優しい正規表現なしのバージョン:

const trim = (str, chars) => str.split(chars).filter(Boolean).join(chars);

端から端まで文字が繰り返されないことが確実なユースケース向け。

2
mbaer3000

これは、先頭と末尾の区切り文字をすべて削除します

const trim = (str, delimiter) => {
  const pattern = `[^\\${delimiter}]`;
  const start = str.search(pattern);
  const stop = str.length - str.split('').reverse().join('').search(pattern);
  return str.substring(start, stop);
}

const test = '||2|aaaa12bb3ccc|||||';
console.log(trim(test, '|')); // 2|aaaa12bb3ccc
1
Dmitriy Botov

長い文字列を処理している場合、割り当てられた文字列の数を0または1に減らすことで、他のほとんどのオプションよりも優れているはずです。

function trim(str, ch) {
    var start = 0, 
        end = str.length;

    while(start < end && str[start] === ch)
        ++start;

    while(end > start && str[end - 1] === ch)
        --end;

    return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}

// Usage:
trim('|hello|world|', '|'); // => 'hello|world'

または、複数の文字のセットからトリミングする場合:

function trimAny(str, chars) {
    var start = 0, 
        end = str.length;

    while(start < end && chars.indexOf(str[start]) >= 0)
        ++start;

    while(end > start && chars.indexOf(str[end - 1]) >= 0)
        --end;

    return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}

// Usage:
trimAny('|hello|world   ', [ '|', ' ' ]); // => 'hello|world'
// because '.indexOf' is used, you could also pass a string for the 2nd parameter:
trimAny('|hello| world  ', '| '); // => 'hello|world'
1
Jason Larke

@ Pho3niX83のソリューションが気に入っています...

「char」の代わりに「Word」で拡張しましょう...

function trimWord(_string, _Word) {

    var splitted = _string.split(_Word);

    while (splitted.length && splitted[0] === "") {
        splitted.shift();
    }
    while (splitted.length && splitted[splitted.length - 1] === "") {
        splitted.pop();
    }
    return splitted.join(_Word);
};
0
foxontherock

私の知る限り、jQueryには、ユーザーが求めているメソッドの組み込み関数はありません。ただし、javascriptでは、replaceを使用して文字列のコンテンツを変更できます。

x.replace(/|/i, ""));

これにより、|のすべての出現が置き換えられます。何もありません。

0
Ole Haugset

試してください:

console.log(x.replace(/\|/g,''));
0
Man Programmer

@leafの答えを展開すると、複数の文字を使用できるものがあります。

var trim = function (s, t) {
  var tr, sr
  tr = t.split('').map(e => `\\\\${e}`).join('')
  sr = s.replace(new RegExp(`^[${tr}]+|[${tr}]+$`, 'g'), '')
  return sr
}
0
AmitK
function trim(text, val) {
    return text.replace(new RegExp('^'+val+'+|'+val+'+$','g'), '');
}
0

Lodashと、trim関数の実装方法を確認することをお勧めします。

ドキュメントについては Lodash Trim を、トリミングを行う正確なコードを確認するには the source を参照してください。

私はこれがあなたの質問に正確な答えを提供しないことを知っていますが、他の人がそれを役に立つと思うかもしれないので、そのような質問にライブラリへの参照を設定するのは良いと思います。

0
drew7721