-
[프렉티컬 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");
문자열 판정
IsNullOrEmpty 메서드
지정된 문자열이 null이거나 빈 문자열("")인지를 나타냅니다.
public static bool IsNullOrEmpty (string? value);
매개 변수
value string테스트할 문자열입니다.
반환
Booleantrue 매개 변수가 value이거나 빈 문자열("")이면 null이고, 그러지 않으면 false입니다.
IsNullOrWhiteSpace 메서드
지정된 문자열이 null이거나 비어 있거나 공백 문자로만 구성되어 있는지를 나타냅니다.
public static bool IsNullOrWhiteSpace (string? value); // null, "", " " 모두 true
매개 변수
value string테스트할 문자열입니다.
반환
Booleantrue 매개 변수가 value 또는 null이거나, Empty(= "")가 모두 공백 문자(= " ")로 구성되어 있으면 value입니다.
문자열 조사
StartsWith
문자열 인스턴스의 시작 부분과 지정한 문자열이 일치하는지를 확인합니다.
if (str.StartsWith("Visual")) { Console.WriteLine("Visual로 시작됩니다."); } // '무엇을 하는가(What)'가 아니고 '어떻게 하는가(How)'를 표현한 것이다. // bad code if (str.IndexOf("Visual") == 0) {....}
EndsWith
Contains 메서드
지정한 문자가 이 문자열 내에서 발생하는지 여부를 나타내는 값을 반환합니다.
Any 메서드
-String 클래스는 IEnumerable<char> 인터페이스를 구현하므로 LINQ에 있는 메서드 사용 가능
-시퀀스에 요소가 하나라도 있는지 또는 특정 조건에 맞는 요소가 있는지 확인합니다.
*IEnumerable<T> 인터페이스 또는 IQueryable<T> 인터페이스를 구현하는 형식의 개체
- 결과 중에 하나라도 true를 반환하면 true
All 메서드
시퀀스의 모든 요소가 특정 조건에 맞는지 확인합니다.
문자열 검색 및 추출
IndexOf 메서드
이 인스턴스에서 맨 처음 발견되는 지정된 유니코드 문자 또는 문자열의 0부터 시작하는 인덱스를 보고합니다. 이 인스턴스에 해당 문자나 문자열이 없으면 이 메서드는 -1을 반환합니다.
SubString 메서드
부분 문자열을 검색합니다.
var target = "abbbbcccccddddd"; // bad code! var index = target.IndexOf("cccccc") + 5; var result = target.Substring(index);
매직 넘버를 사용하는 것을 지양해야한다
*코드 상에 직접 쓰는 값. 그 의미를 금방 알 수 없음
문자열 변환
Trim 메서드
현재 문자열에서 지정된 문자 집합의 선행 항목과 후행 항목이 모두 제거되는 새 문자열을 반환합니다.
TrimStart 메서드
TrimEnd 메서드
Remove 메서드
현재 문자열에서 지정한 수의 문자가 삭제되는 새 문자열을 반환합니다.
Insert 메서드
이 인스턴스의 지정된 인덱스 위치에 지정한 문자열이 삽입되는 새 문자열을 반환합니다.
Replace 메서드
- 현재 문자열에서 발견되는 지정된 유니코드 문자 또는 String을 모두 지정된 다른 유니코드 문자 또는 String으로 바꾼 새 문자열을 반환합니다.
- 치환할 문자가 여러 개라면 모두 수정된다.
ToUpper 메서드
이 문자열의 복사본을 대문자로 변환하여 반환합니다.
ToLower 메서드
이 문자열의 복사본을 소문자로 변환하여 반환합니다.
문자열 연결 및 분할
+ 연산자
문자열을 연결한다.
+= 연산자
문자열 끝에 부분 문자열을 추가한다.
Join 정적 메서드
각 요소 또는 멤버 사이에 지정된 구분 기호를 사용하여 지정된 배열 요소나 컬렉션 멤버를 연결합니다.
Splite 메서드
지정된 문자열 또는 유니코드 문자 배열의 요소로 구분된 이 인스턴스의 부분 문자열이 포함된 문자열 배열을 반환합니다.
마지막 문자 맞침표 없애기
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 클래스를 사용하면 루프에서 많은 문자열을 연결할 때 성능이 향상될 수 있습니다.
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 문
지정한 배열의 각 요소에서 지정한 동작을 수행합니다.
문자 배열을 문자열로 만들기
var chars = new char[] { 'A', 'P', 'P', 'L', 'E'}; var str = new string(chars); // str = 'APPLE'
SkipWhile
지정된 조건을 만족하는 요소는 제외하고 나머지 요소 반환합니다.
제공된 표현식이 거짓이 될 때까지, 발생한 값을 건너뜁니다.
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 메서드
시퀀스에서 지정된 수의 요소를 무시한 다음 나머지 요소를 반환합니다.
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.
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 메서드
- 지정된 형식에 따라 개체의 값을 문자열로 변환하여 다른 문자열에 삽입 합니다.
- 최소 자릿수 지정할 때 사용 가능
값형과 참조형 비교
....
여기서 부터 렉 먹어서 날림 ㅠ
다시 작성 예정....
연습문제
문제 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