replacestring中的多个字符
有没有更好的方法来取代string?
我感到惊讶的是,replace不采取字符数组或string数组。 我想我可以写自己的扩展名,但是我很好奇是否有更好的方法来完成以下工作? 注意最后一个Replace是一个string而不是一个字符。
myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n");
谢谢。
您可以使用replace正则expression式。
s/[;,\t\r ]|[\n]{2}/\n/g
-
s/
开始意味着search -
[
和]
之间的字符是要search的字符(以任何顺序) - 第二个
/
分隔search文本和replace文本
用英文写道:
“search;
或,
或\t
或\r
或 (空格)或正好两个连续的
\n
并将其replace为\n
“
在C#中,您可以执行以下操作:(导入System.Text.RegularExpressions
)
Regex pattern = new Regex("[;,\t\r ]|[\n]{2}"); pattern.Replace(myString, "\n");
如果你感觉特别聪明,不想使用正则expression式:
char[] separators = new char[]{' ',';',',','\r','\t','\n'}; string s = "this;is,\ra\t\n\n\ntest"; string[] temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); s = String.Join("\n", temp);
你也可以用一个扩展方法来包装这个。
编辑:或者等待2分钟,我最终会写出来:)
public static class ExtensionMethods { public static string Replace(this string s, char[] separators, string newVal) { string[] temp; temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); return String.Join( newVal, temp ); } }
呃…
char[] separators = new char[]{' ',';',',','\r','\t','\n'}; string s = "this;is,\ra\t\n\n\ntest"; s = s.Replace(separators, "\n");
你可以使用Linq的Aggregate函数:
string s = "the\nquick\tbrown\rdog,jumped;over the lazy fox."; char[] chars = new char[] { ' ', ';', ',', '\r', '\t', '\n' }; string snew = chars.Aggregate(s, (c1, c2) => c1.Replace(c2, '\n'));
这是扩展方法:
public static string ReplaceAll(this string seed, char[] chars, char replacementCharacter) { return chars.Aggregate(seed, (str, cItem) => str.Replace(cItem, replacementCharacter)); }
这是最短的方法:
myString = Regex.Replace(myString, @"[;,\t\r ]|[\n]{2}", "\n");
哦,performance恐怖! 答案有点过时了,但还是…
public static class StringUtils { #region Private members [ThreadStatic] private static StringBuilder m_ReplaceSB; private static StringBuilder GetReplaceSB(int capacity) { var result = m_ReplaceSB; if (null == result) { result = new StringBuilder(capacity); m_ReplaceSB = result; } else { result.Clear(); result.EnsureCapacity(capacity); } return result; } public static string ReplaceAny(this string s, char replaceWith, params char[] chars) { if (null == chars) return s; if (null == s) return null; StringBuilder sb = null; for (int i = 0, count = s.Length; i < count; i++) { var temp = s[i]; var replace = false; for (int j = 0, cc = chars.Length; j < cc; j++) if (temp == chars[j]) { if (null == sb) { sb = GetReplaceSB(count); if (i > 0) sb.Append(s, 0, i); } replace = true; break; } if (replace) sb.Append(replaceWith); else if (null != sb) sb.Append(temp); } return null == sb ? s : sb.ToString(); } }
使用RegEx.Replace,如下所示:
string input = "This is text with far too much " + "whitespace."; string pattern = "[;,]"; string replacement = "\n"; Regex rgx = new Regex(pattern);
以下是有关RegEx.Replace的此MSDN文档的更多信息
性能 – 明智这可能可能不是最好的解决scheme,但它的工作原理。
var str = "filename:with&bad$separators.txt"; char[] charArray = new char[] { '#', '%', '&', '{', '}', '\\', '<', '>', '*', '?', '/', ' ', '$', '!', '\'', '"', ':', '@' }; foreach (var singleChar in charArray) { str = str.Replace(singleChar, '_'); }
string只是不可变的字符数组
你只需要使其变得可变:
- 要么使用
StringBuilder
- 进入
unsafe
世界,玩指点(尽pipe危险)
并尝试遍历最less次数的字符数组。
示例与StringBuilder
public static void MultiReplace(this StringBuilder builder, char[] toReplace, char replacement) { HashSet<char> set = new HashSet<char>(toReplace); for (int i = 0; i < builder.Length; ++i) { var currentCharacter = builder[i]; if (set.Contains(currentCharacter)) { builder[i] = replacement; } } }
那么你只需要像这样使用它:
var builder = new StringBuilder("my bad,url&slugs"); builder.MultiReplace(new []{' ', '&', ','}, '-'); var result = builder.ToString();