답변:
정규식 바꾸기를 사용할 수 있습니다.
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");
\s
실제로는 동등 [ \f\n\r\t\v]
하므로 원래 질문에 없었던 것들을 포함시킵니다. 또한 원래 질문은 Replace("\n\n", "\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");
Regex.Replace
여러 string.Replace
통화 보다 8 배 이상 느립니다 . Split
+ 보다 4 배 느립니다 Join
. 참조 gist.github.com/MarcinJuraszek/c1437d925548561ba210a1c6ed144452
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();
}
}
변경 가능하게 만들어야합니다.
StringBuilder
unsafe
세상에 가서 포인터로 놀아 라 (위험하지만)가장 적은 횟수의 문자 배열을 반복하십시오. HashSet
루프 내에서 문자 시퀀스를 순회하지 않기 때문에 여기에 유의 하십시오. 더 빠른 조회가 필요한 경우 (을 기준으로 ) HashSet
최적화 된 조회로 교체 할 수 있습니다 .char
array[256]
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;
}
}
}
편집-최적화 된 버전
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;
}
}
}
그런 다음 다음과 같이 사용하십시오.
var builder = new StringBuilder("my bad,url&slugs");
builder.MultiReplace(new []{' ', '&', ','}, '-');
var result = builder.ToString();
wchar_t
.net에 있다는 것을 기억하십시오 . 가능한 모든 문자의 부분 집합 만 바꾸는 것입니다 (그리고이를 최적화하려면 65536 부울이 필요합니다 ...)
이 문자열 확장 메소드 를 작성 하여 솔루션의 어딘가에 넣을 수도 있습니다.
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;
}
}
다음과 같이 호출하십시오.
"ABCDE".ReplaceAll("ACE", "xy");
xyBxyDxy
이:
"ABCDEF".ReplaceAll(new string[] { "AB", "DE", "EF" }, "xy");
xyCxyF
RegEx.Replace를 다음과 같이 사용하십시오.
string input = "This is text with far too much " +
"whitespace.";
string pattern = "[;,]";
string replacement = "\n";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);
RegEx.Replace 에 대한이 MSDN 설명서에 대한 자세한 정보는 다음과 같습니다.
string ToBeReplaceCharacters = @"~()@#$%&+,'"<>|;\/*?";
string fileName = "filename;with<bad:separators?";
foreach (var RepChar in ToBeReplaceCharacters)
{
fileName = fileName.Replace(RepChar.ToString(), "");
}
\t
과\r
에 포함되어 있습니다\s
. 따라서 정규 표현식은과 같습니다[;,\s]
.