如何删除字符串周围的特定字符
How to remove specific character surrounding a string?
我有这个字符串:
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
将同时使用ltrim
和rtrim
。
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;
分步说明:
- 检查字符串是否至少有2个字符长,以及是否被特定字符包围
- 如果是,则首先对其进行切片以去除周围的字符,然后对其进行修剪以去除空白
- 如果不是,就直接退货
如果你对这种语法感到奇怪,它是一个箭头函数和一个三元运算符
顺便说一下,括号在三进制中是多余的。
示例用法:
uberTrim(''); // ''
uberTrim(' Plop! '); //'Plop!'
uberTrim('! ...What is Plop?!'); //'...What is Plop?'
使用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"
使用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();
- 在JavaScript中输出转义字符
- 不同浏览器中的空白字符正则表达式行为
- Regex匹配除“”之外的所有字符;.js”;
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 使用RegExp查找url中的字符
- 如何为jQuery屏蔽输入插件创建一个允许字母数字、空格和重音字符的掩码
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 允许在文本框中使用某些字符
- 根据页面的位置突出显示文本中的字符
- 元素的内容必须由格式正确的字符数据或标记组成
- 如何将字符串拆分为字符,但在javascript中保留空格
- 使用Google Maps API向标记添加多个字符
- 处理JSON字符串会导致JavaScript错误
- 如何删除字符串周围的特定字符
- 将字符串分隔在特定字符周围
- 文本区域中的插入符号位置和周围字符
- 如何在字符串中查找子字符串,并返回一个包含子Javascript周围多个字符的新字符串
- Javascript正则表达式:如何删除某些字符周围的所有空白
- 如何使用javascript在字符周围包装元素
- 如何忽略正则表达式中 URL 周围的字符