-
[프렉티컬 C#] 문자열 처리Development/C# 2023. 7. 26. 01:24728x90
문자열 비교
대소문자 구별 : == 연산자 사용
대소문자 구별 없이 : String.Compare 정적 메서드 사용
Compare(String, String, Boolean, CultureInfo)
대/소문자를 구분하거나 구분하지 않고 지정된 두 String 개체를 비교하여 정렬 순서에서 두 개체의 상대 위치를 나타내는 정수를 반환합니다. 문화권별 정보가 비교에 영향을 줍니다.
public static int Compare (string? strA, string? strB, bool ignoreCase);
매개 변수
strA비교할 첫째 문자열입니다.
strB비교할 둘째 문자열입니다.
ignoreCase비교 시 대/소문자를 무시하려면 true이고, 그러지 않으면 false입니다.
C# 4.0 이후 버전에서는 명명된 인수 사용 가능
PrintOrderDetails("Gift Shop", 31, "Red Mug"); // 명명된 인수 사용 PrintOrderDetails(orderNum: 31, productName: "Red Mug", sellerName: "Gift Shop");
명명된 인수와 선택적 인수 - C# 프로그래밍 가이드
C#의 명명된 인수는 위치가 아닌 이름으로 인수를 지정합니다. 선택적 인수는 생략할 수 있습니다.
learn.microsoft.com
문자열 판정
IsNullOrEmpty 메서드
지정된 문자열이 null이거나 빈 문자열("")인지를 나타냅니다.
public static bool IsNullOrEmpty (string? value);
매개 변수
value string테스트할 문자열입니다.
반환
Booleantrue 매개 변수가 value이거나 빈 문자열("")이면 null이고, 그러지 않으면 false입니다.
String.IsNullOrEmpty(String) 메서드 (System)
지정된 문자열이 null이거나 빈 문자열("")인지를 나타냅니다.
learn.microsoft.com
IsNullOrWhiteSpace 메서드
지정된 문자열이 null이거나 비어 있거나 공백 문자로만 구성되어 있는지를 나타냅니다.
public static bool IsNullOrWhiteSpace (string? value); // null, "", " " 모두 true
매개 변수
value string테스트할 문자열입니다.
반환
Booleantrue 매개 변수가 value 또는 null이거나, Empty(= "")가 모두 공백 문자(= " ")로 구성되어 있으면 value입니다.
String.IsNullOrWhiteSpace(String) 메서드 (System)
지정된 문자열이 null이거나 비어 있거나 공백 문자로만 구성되어 있는지를 나타냅니다.
learn.microsoft.com
문자열 조사
StartsWith
문자열 인스턴스의 시작 부분과 지정한 문자열이 일치하는지를 확인합니다.
if (str.StartsWith("Visual")) { Console.WriteLine("Visual로 시작됩니다."); } // '무엇을 하는가(What)'가 아니고 '어떻게 하는가(How)'를 표현한 것이다. // bad code if (str.IndexOf("Visual") == 0) {....}
String.StartsWith 메서드 (System)
지정한 문화권을 사용하여 비교할 때 이 문자열 인스턴스의 시작 부분과 지정한 문자열이 일치하는지를 확인합니다.
learn.microsoft.com
EndsWith
String.EndsWith 메서드 (System)
이 문자열 인스턴스의 끝 부분과 지정한 문자열이 일치하는지를 확인합니다.
learn.microsoft.com
Contains 메서드
지정한 문자가 이 문자열 내에서 발생하는지 여부를 나타내는 값을 반환합니다.
String.Contains Method (System)
Returns a value indicating whether a specified character occurs within this string.
learn.microsoft.com
Any 메서드
-String 클래스는 IEnumerable<char> 인터페이스를 구현하므로 LINQ에 있는 메서드 사용 가능
-시퀀스에 요소가 하나라도 있는지 또는 특정 조건에 맞는 요소가 있는지 확인합니다.
*IEnumerable<T> 인터페이스 또는 IQueryable<T> 인터페이스를 구현하는 형식의 개체
- 결과 중에 하나라도 true를 반환하면 true
Enumerable.Any 메서드 (System.Linq)
시퀀스에 요소가 하나라도 있는지 또는 특정 조건에 맞는 요소가 있는지 확인합니다.
learn.microsoft.com
All 메서드
시퀀스의 모든 요소가 특정 조건에 맞는지 확인합니다.
Enumerable.All<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>) 메서드 (System.Linq)
시퀀스의 모든 요소가 특정 조건에 맞는지 확인합니다.
learn.microsoft.com
문자열 검색 및 추출
IndexOf 메서드
이 인스턴스에서 맨 처음 발견되는 지정된 유니코드 문자 또는 문자열의 0부터 시작하는 인덱스를 보고합니다. 이 인스턴스에 해당 문자나 문자열이 없으면 이 메서드는 -1을 반환합니다.
String.IndexOf 메서드 (System)
이 인스턴스에서 맨 처음 발견되는 지정된 유니코드 문자 또는 문자열의 0부터 시작하는 인덱스를 보고합니다. 이 인스턴스에 해당 문자나 문자열이 없으면 이 메서드는 -1을 반환합니다.
learn.microsoft.com
SubString 메서드
부분 문자열을 검색합니다.
var target = "abbbbcccccddddd"; // bad code! var index = target.IndexOf("cccccc") + 5; var result = target.Substring(index);
매직 넘버를 사용하는 것을 지양해야한다
*코드 상에 직접 쓰는 값. 그 의미를 금방 알 수 없음
String.Substring 메서드 (System)
이 인스턴스에서 부분 문자열을 검색합니다. 이 멤버는 오버로드됩니다. 구문, 사용법 및 예제를 비롯하여 이 멤버에 대한 자세한 내용을 보려면 오버로드 목록에서 이름을 클릭합니다.
learn.microsoft.com
문자열 변환
Trim 메서드
현재 문자열에서 지정된 문자 집합의 선행 항목과 후행 항목이 모두 제거되는 새 문자열을 반환합니다.
String.Trim 메서드 (System)
현재 문자열에서 지정된 문자 집합의 선행 항목과 후행 항목이 모두 제거되는 새 문자열을 반환합니다.
learn.microsoft.com
TrimStart 메서드
String.TrimStart 메서드 (System)
현재 문자열에서 선행 공백 문자를 모두 제거합니다.
learn.microsoft.com
TrimEnd 메서드
String.TrimEnd 메서드 (System)
현재 문자열에서 후행 공백 문자를 모두 제거합니다.
learn.microsoft.com
Remove 메서드
현재 문자열에서 지정한 수의 문자가 삭제되는 새 문자열을 반환합니다.
String.Remove 메서드 (System)
현재 문자열에서 지정한 수의 문자가 삭제되는 새 문자열을 반환합니다.
learn.microsoft.com
Insert 메서드
이 인스턴스의 지정된 인덱스 위치에 지정한 문자열이 삽입되는 새 문자열을 반환합니다.
String.Insert(Int32, String) 메서드 (System)
이 인스턴스의 지정된 인덱스 위치에 지정한 문자열이 삽입되는 새 문자열을 반환합니다.
learn.microsoft.com
Replace 메서드
- 현재 문자열에서 발견되는 지정된 유니코드 문자 또는 String을 모두 지정된 다른 유니코드 문자 또는 String으로 바꾼 새 문자열을 반환합니다.
- 치환할 문자가 여러 개라면 모두 수정된다.
String.Replace 메서드 (System)
현재 문자열에서 발견되는 지정된 유니코드 문자 또는 String을 모두 지정된 다른 유니코드 문자 또는 String으로 바꾼 새 문자열을 반환합니다.
learn.microsoft.com
ToUpper 메서드
이 문자열의 복사본을 대문자로 변환하여 반환합니다.
String.ToUpper 메서드 (System)
이 문자열의 복사본을 대문자로 변환하여 반환합니다.
learn.microsoft.com
ToLower 메서드
이 문자열의 복사본을 소문자로 변환하여 반환합니다.
String.ToLower 메서드 (System)
이 문자열의 복사본을 소문자로 변환하여 반환합니다.
learn.microsoft.com
문자열 연결 및 분할
+ 연산자
문자열을 연결한다.
+= 연산자
문자열 끝에 부분 문자열을 추가한다.
Join 정적 메서드
각 요소 또는 멤버 사이에 지정된 구분 기호를 사용하여 지정된 배열 요소나 컬렉션 멤버를 연결합니다.
String.Join 메서드 (System)
각 요소 또는 멤버 사이에 지정된 구분 기호를 사용하여 지정된 배열 요소나 컬렉션 멤버를 연결합니다.
learn.microsoft.com
Splite 메서드
지정된 문자열 또는 유니코드 문자 배열의 요소로 구분된 이 인스턴스의 부분 문자열이 포함된 문자열 배열을 반환합니다.
String.Split 메서드 (System)
지정된 문자열 또는 유니코드 문자 배열의 요소로 구분된 이 인스턴스의 부분 문자열이 포함된 문자열 배열을 반환합니다.
learn.microsoft.com
마지막 문자 맞침표 없애기
var text = "The box on the table is mine." var word = text.Split(new [] { ' ', '.'}, StringSplitOptions.RemoveEmptyEntries);
1) ''과 '.'을 구분 문자로 지정 2) 마지막 배열 요소에는 빈 문자열만 저장 3) 옵션으로 빈 배열 요소 제거
StringBuilder
String 개체는 변경할 수 없습니다. System.String 클래스에서 메서드 중 하나를 사용할 때마다 메모리에 새 문자열 개체가 생성되므로, 새 개체에 대한 공간을 새로 할당해야 합니다.
문자열을 반복적으로 수정해야 하는 경우 새로운 String 개체 생성과 관련된 오버헤드로 인해 비용이 증가할 수 있습니다. 새 개체를 만들지 않고 문자열을 수정하려는 경우 System.Text.StringBuilder 클래스를 사용할 수 있습니다. 예를 들어 StringBuilder 클래스를 사용하면 루프에서 많은 문자열을 연결할 때 성능이 향상될 수 있습니다.
.NET에서 StringBuilder 클래스 사용
.NET에서 StringBuilder 클래스를 사용하는 방법을 알아봅니다. 이 클래스를 사용하면 새 개체를 만들지 않고 문자열을 수정합니다.
learn.microsoft.com
StringBuilder 클래스를 사용해 문자열을 연결하는 전형적인 방법
// 1) StringBuilder의 인스턴스 생성 var sb = new StringBuilder(); // 2) for/foreach 같은 반복문을 사용해 문자열 추가 foreach (var workd in GetWords()) { sb.Append(word); } // 3) 마지막에 ToString 메서드를 통해 string형으로 변환 var text = sb.ToString(); Console.WriteLine(text);
-확보된 영영을 초과해서 문자를 추가하려고 했을 경우, 자동으로 용량 증가
-작성한 문자열의 크기를 대략적으로 알고 있을 경우, 메모리 확보에 소모되는 비용 절감을 위해 생성자에서 용량을 지정하는 것을 권장
-생략시, 기본적으로 16자 만큼의 영역이 확보
주의사항
StringBuilder를 사용하면 코드 양이 늘어나고 가독성도 떨어지므로 너무 자주 사용하지 않도록 주의
1) 반복 처리를 하지 않을 경우에는 '+' 연산자로 문자열 연결
2) foreach 문 등을 통해 반복해서 문자열을 연결할 경우에는 StringBuilder 사용
3) 단, 적은 횟수로 반복한다면 '+' 연산자 사용
문자열 = 불변객체
문자열은 인스턴스를 한 번 생성하면 그 값을 수정할 수 없다.
* 한 번 인스턴스를 생성하면 그 값을 수정할 수 없는 객체
// 컴파일 오류! var str = "abc"; str[0] = 'A';
기타 문자열 처리
foreach 문
지정한 배열의 각 요소에서 지정한 동작을 수행합니다.
Array.ForEach<T>(T[], Action<T>) 메서드 (System)
지정한 배열의 각 요소에서 지정한 동작을 수행합니다.
learn.microsoft.com
문자 배열을 문자열로 만들기
var chars = new char[] { 'A', 'P', 'P', 'L', 'E'}; var str = new string(chars); // str = 'APPLE'
SkipWhile
지정된 조건을 만족하는 요소는 제외하고 나머지 요소 반환합니다.
제공된 표현식이 거짓이 될 때까지, 발생한 값을 건너뜁니다.
Enumerable.SkipWhile Method (System.Linq)
Bypasses elements in a sequence as long as a specified condition is true and then returns the remaining elements.
learn.microsoft.com
int[] grades = { 59, 82, 70, 56, 92, 98, 85 }; // Get all grades less than 80 by first // sorting the grades in descending order and then // taking all the grades after the first grade // that is less than 80. IEnumerable<int> lowerGrades = grades.AsQueryable() .OrderByDescending(grade => grade) .SkipWhile(grade => grade >= 80); Console.WriteLine("All grades below 80:"); foreach (int grade in lowerGrades) Console.WriteLine(grade); /* This code produces the following output: All grades below 80: 70 59 56 */
Skip 메서드
시퀀스에서 지정된 수의 요소를 무시한 다음 나머지 요소를 반환합니다.
Enumerable.Skip<TSource>(IEnumerable<TSource>, Int32) Method (System.Linq)
Bypasses a specified number of elements in a sequence and then returns the remaining elements.
learn.microsoft.com
int[] grades = { 59, 82, 70, 56, 92, 98, 85 }; Console.WriteLine("All grades except the first three:"); foreach (int grade in grades.Skip(3)) { Console.WriteLine(grade); } /* This code produces the following output: All grades except the first three: 56 92 98 85 */
Char.IsWhiteSpace 메서드
Indicates whether a Unicode character is categorized as white space.
Char.IsWhiteSpace Method (System)
Indicates whether a Unicode character is categorized as white space.
learn.microsoft.com
ToString 메서드
현재 개체를 나타내는 문자열을 반환합니다.
숫자값을 문자열로 변환할 수 있다.
decimal distance = 9876.123m; var a = distance.ToString(); // "9876.123" var b = distance.ToString("#"); // "9876" var c = distance.ToString("#,0.0"); // "9,876.1" var d = distance.ToString("#,0.0000"); // "9,876.1230"
'0' 기호는 각 자릿수에 해당하는 숫자로 '0' 기호 부분을 치환한다는 의미, 대응되는 숫자가 존재하지 않을 경우에는 그 자리에 '0' 대입
'#' 기호는 각 자릿수에 해당하는 숫자로 '#' 기호 부분을 치환한다는 의미, 대응되는 숫자가 존재하지 않을 경우에는 숫자가 포함되지 않음
decimal distance = 0.0m; var a = distance.ToString(); // "0" var b = distance.ToString("#"); // "" var c = distance.ToString("#,0.0"); // "0.0" var d = distance.ToString("#,0.0000"); // "0.0000"
String.Format 메서드
- 지정된 형식에 따라 개체의 값을 문자열로 변환하여 다른 문자열에 삽입 합니다.
- 최소 자릿수 지정할 때 사용 가능
String.Format 메서드 (System)
지정된 형식에 따라 개체의 값을 문자열로 변환하여 다른 문자열에 삽입 합니다. String.Format 메서드를 처음 사용하는 경우 String.Format 메서드 시작 섹션에서 대략적인 내용을 살펴보세요. String.For
learn.microsoft.com
값형과 참조형 비교
....
여기서 부터 렉 먹어서 날림 ㅠ
다시 작성 예정....
연습문제
문제 5.1
var input1 = Console.ReadLine(); var input2 = Console.ReadLine(); var result = input1 == input2; Console.WriteLine(result);
리뷰
대소문자 구분 안 하면 string.Compare 메서드 사용하기
예시 코드
var s1 = Console.ReadLine(); var s2 = Console.ReadLine(); if (string.Compare(s1, s2, ignoreCase: true) == 0) Console.WriteLine("같다."); else Console.WriteLine("같지 않다.");
문제 5.2
var input = Console.ReadLine(); var result = int.Parse(input); Console.WriteLine($"{result:#,0}");
리뷰
int.TryParse 함수 사용하라고 했는데 int.Prase 로 착각
예시코드
var line = Console.ReadLine(); int num; if (int.TryParse(line, out num)) { Console.WriteLine("{0:#,#}", num); } else { Console.WriteLine("숫자값 문자열이 아닙니다."); }
문제 5.3
var str = "Jackdaws love my big sphinx of quartz"; // 1 int count = str.Where(w => w.ToString() == " ").Count(); Console.WriteLine(count); // 2 string ReplacedStr = str.Replace("big", "small"); Console.WriteLine(ReplacedStr); // 3 int countWord = str.Split().Count(); Console.WriteLine(countWord); // 4 var less4lengthArray = str.Split().Where(w => w.Length <= 4).ToArray(); foreach (var item in less4lengthArray) { Console.WriteLine(item); } // 5 var words = str.Split(); var stringBuilder = new StringBuilder(); foreach (var item in words) { stringBuilder.Append(item); } var text = stringBuilder.ToString(); Console.WriteLine(text);
리뷰
1) count 구할 땐 Count 메서드 사용하기
✕ str.Where(w => w.ToString() == " ").Count();
✓ text.Count(c => c == ' ');
5) 내 출력 결과 : Jackdawslovemybigsphinxofquartz 예제 출력 결과 : Jackdaws love my big sphinx of quartz
✓ 공백 출력 안 함....
✓ 예제 코드 숙지하기....
예제 코드
class Program { static void Main(string[] args) { var text = "Jackdaws love my big sphinx of quartz"; Exercise3_1(text); Console.WriteLine("-----"); Exercise3_2(text); Console.WriteLine("-----"); Exercise3_3(text); Console.WriteLine("-----"); Exercise3_4(text); Console.WriteLine("-----"); Exercise3_5(text); } // 5.3.1 private static void Exercise3_1(string text) { int spaces = text.Count(c => c == ' '); Console.WriteLine("공백 수:{0}", spaces); } // 5.3.2 private static void Exercise3_2(string text) { var replaced = text.Replace("big", "small"); Console.WriteLine(replaced); } // 5.3.3 private static void Exercise3_3(string text) { int count = text.Split(' ').Length; Console.WriteLine("단어 수:{0}", count); } // 5.3.4 private static void Exercise3_4(string text) { var words = text.Split(' ') .Where(s => s.Length <= 4); foreach (var word in words) Console.WriteLine(word); } // 5.3.5 private static void Exercise3_5(string text) { var array = text.Split(' ') .ToArray(); if (array.Length > 0) { var sb = new StringBuilder(array[0]); foreach (var word in array.Skip(1)) { sb.Append(' '); sb.Append(word); } var clone = sb.ToString(); Console.WriteLine(clone); } } }
문제 5.4
static void Main(string[] args) { var str = "Novelist=김만중;BestWork=구운몽;Born=1687"; var novelist = getPartWord(str, "김", 3); var bestWork = getPartWord(str, "구", 3); var born = getPartWord(str, "1", 4); Console.WriteLine($"작가 : {novelist}"); Console.WriteLine($"대표작: {bestWork}"); Console.WriteLine($"출판연도: {born}"); } static string getPartWord(string str, string target, int lengh) { var index = str.IndexOf(target); var result = str.Substring(index, lengh); return result; }
리뷰
✓ 내가 작성한 코드도 나쁘지 않은 것 같음...?
✓ Console.WriteLine이 반복 코드로 작성한게 아쉽긴 함
예제 코드
class Program { static void Main(string[] args) { var line = "Novelist=김만중;BestWork=구운몽;Born=1886"; foreach (var pair in line.Split(';')) { var array = pair.Split('='); Console.WriteLine("{0}:{1}", ToKorean(array[0]), array[1]); } } static string ToKorean(string key) { switch (key) { case "Novelist": return "작가 "; case "BestWork": return "대표작"; case "Born": return "탄생년"; } throw new ArgumentException("인수 key는 정확한 값이 아닙니다."); } }
How 보다는 What이라는 관점에서 코드 작성하기!!!
728x90'Development > C#' 카테고리의 다른 글
[프렉티컬 C#] Dictionary (0) 2023.07.27 [프렉티컬 C#] 배열과 List<T> (0) 2023.07.26 [프렉티컬 C# 연습문제] 2부 - 1장 (0) 2023.07.25 [프랙티컬 C# 연습문제] 1부 - 3장 (0) 2023.07.15 [프랙티컬 C# 연습문제] 1부 - 2장 (0) 2023.07.14