私はこの文字列を持っています:
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:これはコメントで述べたように、文字列の周りにある?
と空白の両方を削除する必要があります。
文字マスクを検索し、残りを返さずに返します。
この提案では、チェックに 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 '));
可能な解決策は、再帰関数を使用して、不要な先頭文字と末尾文字を削除することです。これは正規表現を使用しません。
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
は、ltrim
とrtrim
の両方を使用します。
char
が最初の引数であり、2番目の引数を削除する必要がある文字列である理由は、これを関数型プログラミングスタイル関数に簡単に変更できるようにするためです(ES 2015)。
function ltrim(char) {
(str) => {
<body of function>
}
}
// No need to specify str here
function ltrimSpaces = ltrim(' ');
単に使用します:
let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')
console.log(text)
範囲外のインデックスをチェックし、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"
Array.indexOf
、Array.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"
正規表現なし:
uberTrim = s => s.length >= 2 && (s[0] === s[s.length - 1])?
s.slice(1, -1).trim()
: s;
段階的な説明:
その構文でおかしくなったら、それは 矢印関数 と 三項演算子 です。
ちなみに、括弧は三項では不要です。
使用例:
uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
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);
}
Javascriptのtrimメソッドは空白のみを削除し、パラメーターを取りません。カスタムトリムの場合、独自の機能を作成する必要があります。正規表現はそれに対する迅速な解決策となり、正規表現の作成プロセスを経るのが面倒にならないように w3schools でカスタムトリムの実装を見つけることができます。 (空白の代わりにフィルタリングするために調整する必要がありますか?
正規表現を使用する
'? this is a ? test ?'.replace(/^[? ]*(.*?)[? ]*$/g, '$1')
あなたは正規表現を嫌うかもしれませんが、解決策を見つけた後、あなたはクールに感じるでしょう:)