@Autowired - 최민준
내용
public class CafeStudy implements StudyService {....}
public class SchoolStudy implements StudyService {....}
public class CafeStudy implements StudyService {....}
public class SchoolStudy implements StudyService {....}
정규 표현식 - 조예지
CSV 파일에서는 comma 있는 자료는 쌍따옴표로 묶인다.
1,의원,01_01_02_P,3620000,PHMA119993620020041100004,19990612,,1,영업/정상,13,영업중,,,,,062-515-2875,,500881,광주광역시 북구 풍향동 565번지 4호 3층,"광주광역시 북구 동문대로 24, 3층 (풍향동)",61205,효치과의원,2.02111E+13,U,2021.11.17 2:40,치과의원,192630.7351,185314.6176,치과의원,1,0,0,52.29,401,치과,,,,0,0,,,0,
Java
복사
1. 정규표현식을 이용하여 쌍따옴표 안에 있는 콤마를 제거한 후 쌍따옴표도 제거한다.
public Hospital parse(String str) {
String[] row = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
try{
int id = Integer.parseInt(row[0]);
String service = row[1];
int localCode = Integer.parseInt(row[3]);
String manageNum = row[4];
LocalDateTime licenseDate = strConverterToDate(row[5]);
int businessStatus = Integer.parseInt(row[7]);
int businessCode = Integer.parseInt(row[9]);
String phone = row[15];
String address = row[18].replace("\"","");
String roadAddress = row[19].replace("\"","");
...
Java
복사
•
(?=) (전방 탐색, looahead) : 작성한 패턴에 일치하는 영역이 존재하여도 그 값이 제외되어서 나오는 패턴
◦
= 다음에 오는 문자가 일치하는 영역에서 제외된다.
•
.split() : limit (두번째 파라미터)를 음수로 주면 모든 구분값을 나눠서 배열로 반환한다.
◦
양수면 배열의 길이를 지정하여, 지정된 크기만큼 나눠진다.
◦
파싱할 때는 열이 일정해야 하므로 공백도 배열에 들어가게 해야한다.
2. 라이브러리 사용
•
OpenCSV 라이브러리 사용
•
Parser + ReadLineContext 역할
1.
dependency 설정
//gradle
implementation 'com.opencsv:opencsv:5.5'
//maven
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.5.2</version>
</dependency>
Java
복사
2.
실행
code
•
예외 처리는 깔끔하지 않음
•
예외 처리가 달라서 앞에는 111918개 나왔는데, 이 방식으로는 113829개 나온다.
⭕️ 정규식
public Hospital parse(String str) {
String[] row = str.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
try{
int id = Integer.parseInt(row[0]);
String service = row[1];
int localCode = Integer.parseInt(row[3]);
String manageNum = row[4];
LocalDateTime licenseDate = strConverterToDate(row[5]);
int businessStatus = Integer.parseInt(row[7]);
int businessCode = Integer.parseInt(row[9]);
String phone = row[15];
String address = row[18].replace("\"","");
String roadAddress = row[19].replace("\"","");
...
Java
복사
•
regex : regular expression
사용
•
텍스트에서 원하는 패턴을 찾을 때 (전화번호, 웹주소)
•
다른 문자열로 변환도 가능하다.
•
입력한 데이터가 특정한 패턴에 부합하는지 유효성 검사
•
프로그래밍 언어, 에디터에서도 지원한다.
문법
/ 안에 패턴을 넣고 flag로 옵션 지정
Groups and ranges
| 또는
() 그룹
[ ] 문자 셋이상, 괄호 안의 어떤 문자든
[^] 부정 문자 셋, 괄호 안의 어떤 문자가 아닐 때
(?:) 찾지만 기억하지는 않음
Quantifiers
문자 또는 그룹 뒤에 붙여서
? 없거나 있거나 (zero or one)
*없거나 있거나 많거나 (zero or more)
+하나 또는 많이 (one or more)
{n} n번 반복
{min,} 최소
{min, max} 최소, 그리고 최대
Boundary-type
\b 단어 경계
\B 단어 경계가 아님
^ 문장의 시작
$ 문장의 끝
Character classes
\ 특수 문자가 아닌 문자
. 어떤 글자 (줄바꿈 문자 제외)
\d digit 숫자
\D digit 숫자 아님
\w word 문자
\W word 문자 아님
\s space 공백
\S space 공백 아님
flag
•
global : 매칭되는 다양한 결과값 기억
•
case insensitive : 대소문자 구분 없이
•
multiline
•
single line(dotall)
•
unicode
•
sticky
연습1. 전화번호 찾기
다양한 전화번호를 선택하는 정규표현식을 작성해보자.
010-898-0893
010-405-3412
02.878.8888
010 2033 4845
Java
복사
/\d{2,3}[-. ]\d{3,4}[-. ]\d{4}/gm
Java
복사
연습2. 이메일 선택하기
dream.coder.ellie@gmail.com
hello@daum.net
hello@daum.co.kr
Java
복사
/[a-zA-Z0-9_-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.]+/gm
Java
복사
연습3.유튜브 주소에서 아이디만 가져오기
https://www.youtu.be/-ZClicWm0zM
https://youtu.be/-ZClicWm0zM
youtu.be/-ZClicWm0zM
Java
복사
/(?:https?:\/\/)?(?:www\.)?youtu.be\/([a-zA-Z0-9-]{11})/gm
Java
복사
정규표현식 연습 사이트 : regexr.com/5mhou