C # 문자열에서 여러 문자 바꾸기
문자열을 바꾸는 더 좋은 방법이 있습니까?
Replace가 문자 배열이나 문자열 배열을 사용하지 않는다는 것에 놀랐습니다. 나는 내 자신의 확장을 작성할 수 있다고 생각하지만 다음을 수행하는 더 나은 방법이 있는지 궁금합니다. 마지막 바꾸기는 문자가 아닌 문자열입니다.
myString.Replace(';', '\n').Replace(',', '\n').Replace('\r', '\n').Replace('\t', '\n').Replace(' ', '\n').Replace("\n\n", "\n");
정규식 바꾸기를 사용할 수 있습니다.
s/[;,\t\r ]|[\n]{2}/\n/g
s/
처음에는 검색을 의미합니다- 사이의 문자
[
및]
(임의의 순서로) 검색 할 문자입니다 - 두 번째
/
는 검색 텍스트와 대체 텍스트를 구분합니다
영어로 다음과 같이 읽습니다.
" ;
또는 ,
또는 \t
또는 \r
또는 (공백) 또는 정확히 두 개의 순차
\n
를 검색하여 \n
"
C #에서 다음을 수행 할 수 있습니다. (가져 오기 후 System.Text.RegularExpressions
)
Regex pattern = new Regex("[;,\t\r ]|[\n]{2}");
pattern.Replace(myString, "\n");
당신이 특히 영리하다고 느끼고 정규식을 사용하고 싶지 않은 경우 :
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의 집계 기능을 사용할 수 있습니다.
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));
}
확장 방법 사용 예 :
string snew = s.ReplaceAll(chars, '\n');
가장 짧은 방법입니다.
myString = Regex.Replace(myString, @"[;,\t\r ]|[\n]{2}", "\n");
오, 공연 공포! 대답은 약간 구식이지만 여전히 ...
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();
}
}
문자열은 불변의 char 배열입니다.
변경 가능하게 만들어야합니다.
- 사용하여
StringBuilder
unsafe
세상에 가서 포인터로 놀아 라 (위험하지만)
and try to iterate through the array of characters the least amount of times. Note the HashSet
here, as it avoids to traverse the character sequence inside the loop. Should you need an even faster lookup, you can replace HashSet
by an optimized lookup for char
(based on an array[256]
).
Example with 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;
}
}
}
Edit - Optimized version
public static void MultiReplace(this StringBuilder builder,
char[] toReplace,
char replacement)
{
var set = new bool[256];
foreach (var charToReplace in toReplace)
{
set[charToReplace] = true;
}
for (int i = 0; i < builder.Length; ++i)
{
var currentCharacter = builder[i];
if (set[currentCharacter])
{
builder[i] = replacement;
}
}
}
Then you just use it like this:
var builder = new StringBuilder("my bad,url&slugs");
builder.MultiReplace(new []{' ', '&', ','}, '-');
var result = builder.ToString();
You may also simply write these string extension methods, and put them somewhere in your solution:
using System.Text;
public static class StringExtensions
{
public static string ReplaceAll(this string original, string toBeReplaced, string newValue)
{
if (string.IsNullOrEmpty(original) || string.IsNullOrEmpty(toBeReplaced)) return original;
if (newValue == null) newValue = string.Empty;
StringBuilder sb = new StringBuilder();
foreach (char ch in original)
{
if (toBeReplaced.IndexOf(ch) < 0) sb.Append(ch);
else sb.Append(newValue);
}
return sb.ToString();
}
public static string ReplaceAll(this string original, string[] toBeReplaced, string newValue)
{
if (string.IsNullOrEmpty(original) || toBeReplaced == null || toBeReplaced.Length <= 0) return original;
if (newValue == null) newValue = string.Empty;
foreach (string str in toBeReplaced)
if (!string.IsNullOrEmpty(str))
original = original.Replace(str, newValue);
return original;
}
}
Call them like this:
"ABCDE".ReplaceAll("ACE", "xy");
xyBxyDxy
And this:
"ABCDEF".ReplaceAll(new string[] { "AB", "DE", "EF" }, "xy");
xyCxyF
Use RegEx.Replace, something like this:
string input = "This is text with far too much " +
"whitespace.";
string pattern = "[;,]";
string replacement = "\n";
Regex rgx = new Regex(pattern);
Here's more info on this MSDN documentation for RegEx.Replace
Performance-Wise this probably might not be the best solution but it works.
var str = "filename:with&bad$separators.txt";
char[] charArray = new char[] { '#', '%', '&', '{', '}', '\\', '<', '>', '*', '?', '/', ' ', '$', '!', '\'', '"', ':', '@' };
foreach (var singleChar in charArray)
{
str = str.Replace(singleChar, '_');
}
string ToBeReplaceCharacters = @"~()@#$%&+,'"<>|;\/*?";
string fileName = "filename;with<bad:separators?";
foreach (var RepChar in ToBeReplaceCharacters)
{
fileName = fileName.Replace(RepChar.ToString(), "");
}
참고URL : https://stackoverflow.com/questions/7265315/replace-multiple-characters-in-a-c-sharp-string
'Programing' 카테고리의 다른 글
Swift에서 키-값 관찰 (KVO)이 가능합니까? (0) | 2020.06.03 |
---|---|
파이썬은 CSV를 목록으로 가져옵니다. (0) | 2020.06.03 |
사용자 정의 listview 어댑터 getView 메소드가 여러 번 호출되며 일관된 순서로 호출되지 않습니다. (0) | 2020.06.03 |
파이썬에서 선행 공백을 어떻게 제거합니까? (0) | 2020.06.03 |
Express에서 등록 된 모든 경로를 얻는 방법은 무엇입니까? (0) | 2020.06.03 |