JavaScript中与此 C#
方法相等的是什么JavaScript?
var x = "|f|oo||";
var y = x.Trim('|'); // "f|oo"
C# 仅会在字符串开头和结尾修剪所选字符!
JavaScript中与此 C#
方法相等的是什么JavaScript?
var x = "|f|oo||";
var y = x.Trim('|'); // "f|oo"
C# 仅会在字符串开头和结尾修剪所选字符!
一行足矣:
var x = '|f|oo||';
var y = x.replace(/^\|+|\|+$/g, '');
document.write(x + '<br />' + y);
^ beginning of the string
\|+ pipe, one or more times
| or
\|+ pipe, one or more times
$ end of the string
一个通用解决方案:
function trim (s, c) {
if (c === "]") c = "\\]";
if (c === "^") c = "\\^";
if (c === "\\") c = "\\\\";
return s.replace(new RegExp(
"^[" + c + "]+|[" + c + "]+$", "g"
), "");
}
chars = ".|]\\^";
for (c of chars) {
s = c + "foo" + c + c + "oo" + c + c + c;
console.log(s, "->", trim(s, c));
}
参数 c
要求为字符(长度为1的字符串)。
如评论所述,支持多个字符可能会很有用,例如常见的修剪多个空格字符。要实现这一点,MightyPork建议将if
语句替换为以下代码行:
c = c.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
这部分内容 [-/\\^$*+?.()|[\]{}]
是正则表达式语法中的一组特殊字符,$&
是一个占位符,代表匹配的字符,意味着 replace
函数会转义特殊字符。在您的浏览器控制台中尝试:
> "{[hello]}".replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
"\{\[hello\]\}"
c = c.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
- MightyPork^
漏掉了。谢谢。 - user1636522"\t "
,这种用例。 - MightyPork-
(trim("-foo--oo---", '-')
),并没有引起任何问题。无论如何,修剪多种类型的空格字符的想法听起来很有趣,我将在原始答案下面总结您的想法。 - user1636522更新:为了了解不同解决方案的性能,因此我在这里更新了一个基本的基准测试: https://www.measurethat.net/Benchmarks/Show/12738/0/trimming-leadingtrailing-characters
在Chrome下运行时有一些有趣且意外的结果。 https://www.measurethat.net/Benchmarks/ShowResult/182877
+-----------------------------------+-----------------------+
| Test name | Executions per second |
+-----------------------------------+-----------------------+
| Index Version (Jason Larke) | 949979.7 Ops/sec |
| Substring Version (Pho3niX83) | 197548.9 Ops/sec |
| Regex Version (leaf) | 107357.2 Ops/sec |
| Boolean Filter Version (mbaer3000)| 94162.3 Ops/sec |
| Spread Version (Robin F.) | 4242.8 Ops/sec |
+-----------------------------------+-----------------------+
请注意;测试仅针对单个测试字符串进行(需要修剪前导和尾随字符)。此外,此基准仅给出原始速度的指示;还要考虑其他因素,如内存使用情况。function trim(str, ch) {
var start = 0,
end = str.length;
while(start < end && str[start] === ch)
++start;
while(end > start && str[end - 1] === ch)
--end;
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trim('|hello|world|', '|'); // => 'hello|world'
或者如果你想从一组多个字符中剪切:
function trimAny(str, chars) {
var start = 0,
end = str.length;
while(start < end && chars.indexOf(str[start]) >= 0)
++start;
while(end > start && chars.indexOf(str[end - 1]) >= 0)
--end;
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trimAny('|hello|world ', [ '|', ' ' ]); // => 'hello|world'
// because '.indexOf' is used, you could also pass a string for the 2nd parameter:
trimAny('|hello| world ', '| '); // => 'hello|world'
编辑:为了好玩,修剪单词(而不是单独字符)
// Helper function to detect if a string contains another string
// at a specific position.
// Equivalent to using `str.indexOf(substr, pos) === pos` but *should* be more efficient on longer strings as it can exit early (needs benchmarks to back this up).
function hasSubstringAt(str, substr, pos) {
var idx = 0, len = substr.length;
for (var max = str.length; idx < len; ++idx) {
if ((pos + idx) >= max || str[pos + idx] != substr[idx])
break;
}
return idx === len;
}
function trimWord(str, word) {
var start = 0,
end = str.length,
len = word.length;
while (start < end && hasSubstringAt(str, word, start))
start += word.length;
while (end > start && hasSubstringAt(str, word, end - len))
end -= word.length
return (start > 0 || end < str.length) ? str.substring(start, end) : str;
}
// Usage:
trimWord('blahrealmessageblah', 'blah');
String.prototype.trimChar = String.prototype.trimChar || function (chr) { // ...
如果你不想将其作为扩展,你也可以嗅探trim(undefined, "|")
。 - ruffin如果我理解正确,您希望仅在字符串的开头或结尾删除特定字符(例如:||fo||oo||||
应变为 foo||oo
)。您可以创建一个如下的临时函数:
function trimChar(string, charToRemove) {
while(string.charAt(0)==charToRemove) {
string = string.substring(1);
}
while(string.charAt(string.length-1)==charToRemove) {
string = string.substring(0,string.length-1);
}
return string;
}
我使用以下代码测试了这个函数:
var str = "|f|oo||";
$( "#original" ).html( "Original String: '" + str + "'" );
$( "#trimmed" ).html( "Trimmed: '" + trimChar(str, "|") + "'" );
您可以使用正则表达式,例如:
var x = "|f|oo||";
var y = x.replace(/^\|+|\|+$/g, "");
alert(y); // f|oo
更新:
如果你希望将这个操作通用化成为一个函数,你可以按照以下步骤进行:
var escapeRegExp = function(strToEscape) {
// Escape special characters for use in a regular expression
return strToEscape.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
};
var trimChar = function(origString, charToTrim) {
charToTrim = escapeRegExp(charToTrim);
var regEx = new RegExp("^[" + charToTrim + "]+|[" + charToTrim + "]+$", "g");
return origString.replace(regEx, "");
};
var x = "|f|oo||";
var y = trimChar(x, "|");
alert(y); // f|oo
一种不使用正则表达式且易于阅读的版本:
const trim = (str, chars) => str.split(chars).filter(Boolean).join(chars);
对于使用情况,我们确定边缘字符不会重复。
split
对于每个分割符相等的部分返回未定义的元素 `const trim = (str, chars) => str.split(chars).filter(x => { Boolean(x); console.log(typeof(x), x, Boolean(x)); }).join(chars);const str = "#//#//abc#//test#//end#//";
console.log(trim(str, '#//'));` - TamusJRoycetrim("|first||last|", "|")
返回 first|last
(仅在中间有一个管道符号)。 - Corneliuspath.split('/').filter(Boolean).join('/')
这对我来说非常有效 :-)非常感谢! - Alexander Gavriliukfunction 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);
}
@fabian提出评论后的改进版(可以处理仅包含相同字符的字符串)
function trimByChar1(string, character) {
const arr = Array.from(string);
const first = arr.findIndex(char => char !== character);
const last = arr.reverse().findIndex(char => char !== character);
return (first === -1 && last === -1) ? '' : string.substring(first, string.length - last);
}
[].concat(string)
,这不是期望的结果。使用Array.from(string)
将起作用。 - Fabian这可以一次修剪多个字符:
function trimChars (str, c) {
var re = new RegExp("^[" + c + "]+|[" + c + "]+$", "g");
return str.replace(re,"");
}
var x = "|f|oo||";
x = trimChars(x, '|'); // f|oo
var y = "..++|f|oo||++..";
y = trimChars(y, '|.+'); // f|oo
var z = "\\f|oo\\"; // \f|oo\
// For backslash, remember to double-escape:
z = trimChars(z, "\\\\"); // f|oo
如果您需要在自己的脚本中使用,并且不介意更改原型,那么这可以是一个方便的“技巧”:
String.prototype.trimChars = function (c) {
var re = new RegExp("^[" + c + "]+|[" + c + "]+$", "g");
return this.replace(re,"");
}
var x = "|f|oo||";
x = x.trimChars('|'); // f|oo
由于我在一个脚本中频繁使用trimChars函数,所以我更喜欢这个解决方案。但是修改对象的原型可能会带来潜在问题。
var trimChars = (x, y) => x.replace(new RegExp(\
^[${y}]+|[${y}]+$`, "g"),"");` - 一行代码 - Alex SzücsString.prototype.trimLeft = function(charlist) {
if (charlist === undefined)
charlist = "\s";
return this.replace(new RegExp("^[" + charlist + "]+"), "");
};
String.prototype.trim = function(charlist) {
return this.trimLeft(charlist).trimRight(charlist);
};
String.prototype.trimRight = function(charlist) {
if (charlist === undefined)
charlist = "\s";
return this.replace(new RegExp("[" + charlist + "]+$"), "");
};
var withChars = "/-center-/"
var withoutChars = withChars.trim("/-")
document.write(withoutChars)
String.prototype.MyOwn_trim
),或者只需在String.prototype
之外创建简单的函数即可。 - gsubiranconst trim = (str, char) => {
let i = 0;
let j = str.length-1;
while (str[i] === char) i++;
while (str[j] === char) j--;
return str.slice(i,j+1);
}
console.log(trim('|f|oo|', '|')); // f|oo
非正则表达式解决方案。
双指针:i
(起始)和j
(结束)。
仅当指针匹配字符时移动,不匹配时停止。
返回剩余的字符串。
trim
函数。
trim
函数不接受参数。 - Martin Braun