如何删除字符串周围的特定字符

How to remove specific character surrounding a string?

本文关键字:周围 字符 字符串 何删除 删除      更新时间:2023-12-08

我有这个字符串:

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中运行良好。现在我想知道我是否可以在JS中使用trim()来做到这一点。


需要注意的是,我可以使用regex来实现这一点,但老实说,我讨厌regex用于此类工作。不管怎样,还有更好的解决方案吗?


编辑:正如评论中提到的,我需要删除字符串周围的?和空白。

搜索字符掩码并返回不带的其余值。

此建议使用逐位而非~运算符进行检查。

~是按位非运算符。它非常适合与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 '));

简单使用:

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

一个可能的解决方案是使用递归函数来删除不需要的前导和尾随字符。这不使用正则表达式。

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;
    }
}

当然,这只是众多可能的解决方案之一。函数trim将同时使用ltrimrtrim

char是第一个参数,而需要清理的字符串是第二个参数,这是为了更容易将其更改为函数式编程风格的函数,就像这样(ES 2015):

function ltrim(char) {
    (str) => {
        <body of function>
    }
}
// No need to specify str here
function ltrimSpaces = ltrim(' ');

这里有一种方法,它检查索引是否越界,并且只对substring:进行一次调用

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"

无正则表达式:

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?'

使用Array.indexOfArray.lastIndexOfArray.slice函数的简单方法:

更新:(注意:作者已请求修剪周围的字符)

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"

使用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);
}

使用正则表达式

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

你可能讨厌regex,但找到解决方案后,你会觉得很酷:)

Javascript的trim方法只删除空白,不带任何参数。对于自定义修剪,您必须制作自己的功能。Regex会为它提供一个快速的解决方案,如果你不想经历Regex创建过程的麻烦,你可以在w3schools上找到一个自定义修剪的实现。(您只需要将其调整为filter?,而不是空白

这在一行代码中返回您想要的输出:

"? this is a ? test ?".slice(1).slice(0,-1).trim();