我有这个字符串:
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,但说实话,我讨厌这种工作的正则表达式。无论如何还有更好的解决方案吗?
编辑:正如评论中提到的那样,我需要删除?
和字符串周围的空格。
答案 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
将同时使用ltrim
和rtrim
。
char
是第一个参数和第二个需要清理的字符串的原因是为了更容易将其更改为函数式编程样式函数,如此(ES 2015):
function ltrim(char) {
(str) => {
<body of function>
}
}
// No need to specify str here
function ltrimSpaces = ltrim(' ');
答案 2 :(得分:4)
只需使用:
let text = '?? something ? really ??'
text = text.replace(/^([?]*)/g, '')
text = text.replace(/([?]*)$/g, '')
console.log(text)
&#13;
答案 3 :(得分:3)
使用Array.indexOf
,Array.lastIndexOf
和Array.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?'
分步说明:
如果你被这种语法所困扰,那就是Arrow Function和ternary 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();