코딩공부

정규표현식, XML과 JSON, Tokenizer, Lexer, Parser, AST

늠재 2025. 4. 29. 01:54

정규표현식

특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어.

문자열에서 특정한 패턴을 찾거나, 치환하거나, 검증할 때 사용하는 일종의 문법 규칙이다.

많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원함

펄과 Tcl은 언어 자체에 강력한 정규 표현식을 구현하고 있음. 

컴퓨터 과학의 정규 언어로부터 유래하였으나

구현체(interpreter or compiler)에 따라 정규 언어보다 더 넓은 언어를 표현할 수 있는 경우도 있고,

정규 표현식 자체 문법도 여러 가지 존재하고 있다.

*이스케이프 문자는 프로그래밍 언어들 기초 문법 공부할 때 처럼 백슬래시 붙이고 사용한다.

 

 

표현식 설명 예시

. 임의의 한 문자 (줄바꿈 제외) a.c는 abc, a1c
\d 숫자 (0~9) \d+는 123, 45
\D 숫자가 아닌 문자 \D+는 abc, @#!
\w 단어 문자 (영문자, 숫자, _) \w+는 hello_1
\W 단어 문자가 아닌 것 공백, 특수문자 등
\s 공백 문자 (스페이스, 탭 등) \s+
\S 공백이 아닌 문자 \S+
[...] 대괄호 안 문자 중 하나 [aeiou]는 모음
[^...] 괄호 안 문자를 제외한 문자 [^0-9]는 숫자 제외

표현식 설명

* 0회 이상 반복
+ 1회 이상 반복
? 0회 또는 1회
{n} 정확히 n번
{n,} n번 이상
{n,m} n~m회 반복

표현식 설명

^ 문자열 시작
$ 문자열 끝
\b 단어 경계 (word boundary)
\B 단어가 아닌 경계

표현식 설명

(abc) 그룹화
(?:abc) 캡처하지 않는 그룹
(?<name>abc) 이름 있는 그룹 (Python 등 일부 언어 지원)
`a b`

표현식 설명

\1, \2... 첫 번째, 두 번째 그룹 재참조

표현식 설명

(?=...) 긍정형 전방탐색 (조건은 있지만 포함 안 됨)
(?!...) 부정형 전방탐색
(?<=...) 긍정형 후방탐색
(?<!...) 부정형 후방탐색

 

사용 예시

주민등록번호

\d{6}-\d{7}

\d : 숫자 조건

{n} : 정확히 n개의 숫자 입

이메일 유효성 검사

^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$

^ : 문자열 시작

[] : 대괄호 안에 들어가는 것들 모두 입력 가능

+ : 이 조건이 하나 이상 반복될 수 있음(여러 글자 입력)

\. : 마침표 삽입

{n,(m)} : n~m번 이상 반복,  m 칸이 비워져 있으면 n번만 반복

$  : 문자열 끝

 

XML(eXtensible Markup Language), 다목적 마크업 언어.

많은 종류의 데이터를 기술하는 데 사용. 

주로 서로다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리

데이터를 쉽게 주고받을 수 있도록 하여 HTML의 한계를 극복할 목적으로 만들어짐.

가볍고 빠르며 현대 웹 API의 표준이다.

1.태그 기반의 구조로 이루어져 있고, 사람이 읽기 쉬우며 트리 구조 표현에 장점이 드러난다.

2.사용자 마음대로 태그를 정의하고 확장이 가능하지만

3.문법이 엄격하다. 태그를 꼭 닫거나, 대소문자를 구분한다.

ex)

<person>
  <name>홍길동</name>
  <age>30</age>
  <email>hong@example.com</email>
</person>

JSON(JavaScript Objec Notation)

모든 시리얼화 가능한 값이나 키-값 쌍으로 이루어진 데이터 오브젝트를 전달하기 위한,

인간이 읽을 수 잇는 텍스트를 사용하는 개방형 표준 포맷.

1. JavaScript 문법을 기반으로 한 데이터 형식이며,

2. 간결하고 빠르게 작성할 수 있고,

3. 프로그래밍 언어에서 특히 다루기 쉬우며,

4. 가벼운 구조로 웹이나 모바일에서 많이 사용한다.

ex)

{
  "name": "홍길동",
  "age": 30,
  "email": "hong@example.com"
}

 

비교

형식 태그 기반 키-값 쌍 기반
가독성 사람에게 좋음 (하지만 길어짐) 간결하고 짧음
문서 구조 복잡한 구조 표현 가능 간단한 구조에 적합
확장성 자유로운 태그 정의 제한적
데이터 타입 모든 값이 문자열 숫자, 불리언, 배열 등 지원
파싱 속도 느림 빠름
사용처 웹서비스(SOAP), 설정파일 REST API, 웹/앱 통신 등

 

컴파일러는 구문 분석 -> 코드생성 -> 링킹의 과정을 거치는데,

구문 분석 과정에서 Tokenizer, Lexer, Praser를 차례대로 거친다.

Tokenizer : 문자열을 띄어쓰기, 기호, 규칙 등에 따라 작은 단위(토큰)으로 쪼갬.

입력된 텍스트를 모델에서 처리할 수 잇는 데이터로 변환하기 위해 사용한다.

모델은 숫자만 처리할 수 있어, 토크나이저는 입력값의 문자열을 숫자 데이터로 변환한다.

ex) x = 10 + 2 

=> ['x', '=', '10', '+', '2']

종류

1. 공백 기반 토크나이저(Whitespace Tokenizer)

- 텍스트를 공백으로 구분해 토크나이징하는 방법

- 영어같은 공백으로 단어가 구분되는 언어에서 작동함

- 중국어나 한국어 같은 공백으로 단어 구분이 잘 되지 않는 언어에서는 적합하지 않음

2. 기본 정규식 토크나이저(Regex(Regular Expression) Tokenizer)

- 정규표현식을 사용해 텍스트를 분할하는 방식이다.

- 사용자가 원하는 기준에 따라 토크나이징이 가능

- 공백 외에도 문장 부호 등 다른 문자를 기준으로도 분할할 수 있다.

Lexer : Tokenizer 로 쪼개진 토큰들의 의미를 분석하는 역할을 한다.

- Tokenizer의 결과를 바탕으로 각 토큰의 종류를 분류함

- Lexical Analyze : Tokeni zer를 거치며 의미있는 단위로 쪼개지고, Lexer를 거치며 결과의 의미를 분석하는 과정을 통틀어 말함.

ex) x = 10 + 2

IDENTIFIER(x)  
OPERATOR(=)  
NUMBER(10)  
OPERATOR(+)  
NUMBER(2)

Parser : Lexical Analyze되어 Tokenize된 데이터를 구조적으로 나타냄

- Syntax Analyze : 데이터가 올바른지 검사하는 역할도 수행함.

- Parser에 의해 도출된 결과는 AST 형태로 생성됨.

- 문법에 맞지 않으면 에러가 발생

 

AST(Abstract Syntex Tree) : Parser에 의해 도출된 결과를 트리 형태로 나타내는 자료구조

- 컴퓨터가 이해할 수 있는 구조로 변형

- 구문 분석 단계의 결과. 컴파일러, 인터프리터, 코드 분석 도구, LLM 등이 사용

- 대부분의 개발 도구의 핵심.

ex)

Assignment
├── Variable: x
└── BinaryOperation (+)
    ├── Number: 10
    └── Number: 2