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

时间:2016-04-03 20:36:59

标签: javascript php regex string trim

我有这个字符串:

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() works well in PHP。现在我想知道我是否可以使用trim()在JS中执行此操作。

应该注意I can do that using regex,但说实话,我讨厌这种工作的正则表达式。无论如何还有更好的解决方案吗?

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

10 个答案:

答案 0 :(得分:11)

搜索字符掩码并在不使用的情况下返回其余部分。

此提案使用bitwise not ~运算符进行检查。

  

~bitwise not operator。它非常适合与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 '));




答案 1 :(得分:6)

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

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(' ');

答案 2 :(得分:4)

只需使用:

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

console.log(text)
&#13;
&#13;
&#13;

答案 3 :(得分:3)

使用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"

答案 4 :(得分:3)

没有正则表达式:

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

分步说明:

  1. 检查字符串是否长度至少为2个字符,并且是否包含特定字符;
  2. 如果是,则首先将其切片以删除周围的字符,然后修剪它以删除空格;
  3. 如果不是,只需将其归还。
  4. 如果你被这种语法所困扰,那就是Arrow Functionternary operator。 顺便说一下,括号中的括号是多余的。

    使用示例:

    py.test --ignore=env
    

答案 5 :(得分:3)

这是一种方法,它可以检查索引越界,只调用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"

答案 6 :(得分:2)

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

答案 7 :(得分:1)

Javascript的trim方法只删除空格,不带参数。对于自定义修剪,您必须自己创建功能。正则表达式会为它做一个快速的解决方案,你可以在w3schools上找到一个自定义修剪的实现,以防你不想经历正则表达式创建过程。 (你只需要调整它来过滤?而不是空格

答案 8 :(得分:0)

使用正则表达式

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

你可能讨厌正则表达式,但在找到解决方案后你会觉得很酷:)

答案 9 :(得分:0)

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

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