从字符串中删除特定字符

224

JavaScript中与此 C# 方法相等的是什么JavaScript?

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

C# 仅会在字符串开头结尾修剪所选字符!


2
我感到困惑的是,在ECMAScript中trim函数不接受参数。 - Martin Braun
22个回答

1

解决这个任务的最佳方式是(类似于PHP的trim函数):

function trim( str, charlist ) {
  if ( typeof charlist == 'undefined' ) {
    charlist = '\\s';
  }
  
  var pattern = '^[' + charlist + ']*(.*?)[' + charlist + ']*$';
  
  return str.replace( new RegExp( pattern ) , '$1' )
}

document.getElementById( 'run' ).onclick = function() {
  document.getElementById( 'result' ).value = 
  trim( document.getElementById( 'input' ).value,
  document.getElementById( 'charlist' ).value);
}
<div>
  <label for="input">Text to trim:</label><br>
  <input id="input" type="text" placeholder="Text to trim" value="dfstextfsd"><br>
  <label for="charlist">Charlist:</label><br>
  <input id="charlist" type="text" placeholder="Charlist" value="dfs"><br>
  <label for="result">Result:</label><br>
  <input id="result" type="text" placeholder="Result" disabled><br>
  <button type="button" id="run">Trim it!</button>
</div>

P.S.:为什么在大多数人已经回答之后,我还要发表自己的答案?因为我发现了所有答案中最好的错误:所有人都使用了“+”元字符而不是“*”,因为trim必须删除开头和/或结尾的字符,但在其他情况下它会返回原始字符串。


1

另一种使用正则表达式的版本。

没有使用或(|),也没有使用全局匹配(g)。

function escapeRegexp(s) {
  return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}

function trimSpecific(value, find) {
  const find2 = escapeRegexp(find);
  return value.replace(new RegExp(`^[${find2}]*(.*?)[${find2}]*$`), '$1')
}

console.log(trimSpecific('"a"b"', '"') === 'a"b');
console.log(trimSpecific('""ab"""', '"') === 'ab');
console.log(trimSpecific('"', '"') === '');
console.log(trimSpecific('"a', '"') === 'a');
console.log(trimSpecific('a"', '"') === 'a');
console.log(trimSpecific('[a]', '[]') === 'a');
console.log(trimSpecific('{[a]}', '[{}]') === 'a');


1
这个函数可以去掉所有开头和结尾的分隔符。
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
我喜欢@Pho3niX83的解决方案...让我们将其扩展为“单词”而不是“字符”...
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

0

const special = ':;"<>?/!`~@#$%^&*()+=-_ '.split("");
const trim = (input) => {
    const inTrim = (str) => {
        const spStr = str.split("");
        let deleteTill = 0;
        let startChar = spStr[deleteTill];
        while (special.some((s) => s === startChar)) {
            deleteTill++;
            if (deleteTill <= spStr.length) {
                startChar = spStr[deleteTill];
            } else {
                deleteTill--;
                break;
            }
        }
        spStr.splice(0, deleteTill);
        return spStr.join("");
    };
input = inTrim(input);
input = inTrim(input.split("").reverse().join("")).split("").reverse().join("");
return input;
};
alert(trim('@#This is what I use$%'));


0

在 @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
function trim(text, val) {
    return text.replace(new RegExp('^'+val+'+|'+val+'+$','g'), '');
}

-2
String.prototype.TrimStart = function (n) {
    if (this.charAt(0) == n)
        return this.substr(1);
};

String.prototype.TrimEnd = function (n) {
    if (this.slice(-1) == n)
        return this.slice(0, -1);
};

它只会移除一个出现的字符,但不会一直删除直到该字符完全被删除。 - KoalaBear
1
不要覆盖默认的字符串原型,否则以后会麻烦。请在其他地方创建自己的单独函数。 - rooby

-3
据我所知,jQuery没有内置函数来执行你所询问的方法。 但是,使用JavaScript,你可以使用replace来更改你的字符串内容:
x.replace(/|/i, ""));

这将替换所有出现的 | 为空。

1
有没有办法仅在开头/结尾删除 | ? - fubo
我认为这篇文章会让你更好地了解你的问题:https://dev59.com/u2Ij5IYBdhLWcg3wflMy - Ole Haugset
@fubo 当然可以... 只需要在结尾加上 $"||spam|||".replace(/\|+$/g, "") 或者在开头加上 ^: "||spam|||".replace(/^\|+/g, "") - ruffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接