레일크래프트(Railcraft)


원 개발자: 코버트재규어 (CovertJaguar)

강좌에 사용된 버전:10.3.1

마인크래프트 버전:1.10.2

주의사항: 조합법은 JEI를 참고하도록 합시다. 레시피 변경이 잦습니다.


주의사항 2: 이 강좌는 안 그래도 어려운 내용을 초보자가 설명하고 있습니다. 정 이해하기 힘들면 위키백과(https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D)를 참조하세요.


주의사항 3: 이번 강좌도 최가 씁니다.


#106 - 정규표현식으로 라우팅하기


라우팅을 설정하다 보면 설정하다 보면 골치아픈 경우가 생깁니다. 각자 다른 목적지를 가진 열차들이 같은 노선을 공유할 때죠.

예를 들어서, 여우굴(FOX), 상고로(TGR), 돌벽돌(SB), 미국반점(MGFD), 헤르스탈(HRSTL), 사하(CAXA)간 운행하는 열차 시스템의 철로를 최대한 줄이기 위해 노선 대부분을 공유하고, 분기점을 이곳저곳에 설치한 선로를 생각해 봅시다. 여기서 여우굴로 빠지는 분기점을 설정해 주고 있다면?

아이고 맙소사.


물론 라우팅 테이블 길이에 제한이 있지는 않지만 일일히 쓰고 빠진 것이 없는지 확인하기는 너무 힘듭니다. 나중에 여기에 다른 노선을 또 추가한다면(지금도 FOX_MGFD 외에 FOX_MGFD_R이라는 이름의 완행노선이 따로 있는 게 보입니다) 분기점마다 일일히 찾아가서 또 추가해야 합니다.

레일크 제작자는 이 문제를 잘 인식하고 있었는지, 정규표현식(Regular Expression)을 사용할 수 있게 해 놓았습니다.

정규표현식은 프로그램에게 '이러한 문자의 배열을 찾아라'라는 명령을 내릴 때 사용합니다. 라우팅은 Dest조건문과 Name조건문, Rider조건문(1차 조건이 player나 named인 경우에 2차 조건)에서 정규표현식을 지원하며, 사용할 때는 Dest?=의 형태로 등호 앞에 물음표를 붙여서 사용합니다.

. (마침표): 와일드카드 문자. 아무런 문자에나 대응합니다. 'a', 'b', 'c'는 모두 .으로 인식 가능합니다. 여러 번 연속해 쓰면 그만큼의 글자수. 예: ....은 네 글자로 된 아무 문자열, 'time'이나 'fish', 'asdf'을 인식하지만 'craft', 'are'과 같이 글자수가 다르면 인식하지 않습니다.

마침표를 인식하게 하려면 \.을 써야 합니다. 다른 연산자 문자들도 \(백슬래시)를 붙여야 검색됩니다.(e.g. 1\?는 '1?'를 인식합니다)


* : 앞에 붙은 문자가 0번 이상 나타납니다. a*b는 'b', 'ab', 'aab', 'aaab' 등등을 인식합니다.


? : 앞에 붙은 문자가 0번이나 1번 나타납니다. a?b는 'b', 'ab'를 감지하지만 'aab'는 감지하지 않습니다.


+ : 앞에 붙은 문자가 1번 이상 나타납니다. a+b는 'ab', 'aab', 'aaab' 등을 감지하지만 b는 감지하지 않습니다.


| (수직선, \를 쉬프트 누르고 입력하면 나오는 그것): OR 논리연산자입니다. AC|DC는 'AC'나 'DC'를 인식합니다. a|b|c와 같이 겹쳐 쓸 수도 있지만 대괄호가 더 효율적입니다.


(소괄호): 안에 든 식을 하나로 묶어서 처리합니다. (abc)?d는 'd', 'abcd'만 인식합니다. (A|D)C?라고 쓰면 'A', 'AC', 'D', 'DC'를 감지합니다.


{중괄호}: 중괄호 안에 숫자를 넣어 사용합니다.


{숫자}: 정확히 그 수만큼 반복됩니다. 1{4}는 '1111'을 인식합니다.


{min,max}: min 이상, max 이하만큼 반복됩니다. max는 생략 가능(최대 횟수에 제한 없음)하지만 min을 생략할 수는 없습니다.

(abc){1,3}은 'abc','abcabc','abcabcabc'는 인식하지만 'abcabcabcabc'는 인식하지 않습니다.


 [대괄호]: 대괄호 안에 든 문자 중 하나와 일치합니다. 기본적으로는 a|b|c|d와 같이 수직선을 여러 번 쓰는 것과 동일합니다.

대괄호 안에서는 다른 연산자가 작동하지 않습니다.

[abc?]는 'a','b','c','?'를 인식합니다.

[A-Z]는 알파벳 대문자를 인식합니다.

[a-z]는 알파벳 소문자를 인식합니다.

[0-9]는 숫자를 인식합니다.

[A-Za-z0-9]는 알파벳, 숫자를 인식합니다. 특수문자는 인식하지 않습니다.

[A-Fa-f]는 ABCDEFabcdef중 한 글자와 일치합니다.

대괄호 안에서는 소괄호가 작동하지 않으므로 문자열 OR을 쓰기 위해서는 (abc|def|ghi)와 같이 수직선을 씁니다.


[^위첨자가 든 대괄호]: 앞에서 대괄호 쓰임새에 NOT을 붙인 것과 같습니다. 안에 든 문자를 제외한 어떤 문자와도 일치합니다.

[^a]는 a가 아닌 어떤 글자든 한 글자와 일치하며 [^A-Z]는 알파벳 대문자가 아닌 어떤 글자든 일치합니다.


그럼 맨 위에서 보았던 여우굴행 열차의 예시를 다시 봅시다. FOX가 행선지에 들어가는 열차를 인식하게 하기 위해서는

.*FOX.*를 입력하면 됩니다.

성공적으로 분류된 모습.

자세히 뜯어서 살펴보면, .*는 아무 문자(.)나 몇 개나 있거나 없어도 되며(*) FOX가 그 뒤에 나타나며 또 그 뒤에 아무것이나 있어도 되고 없어도 된다는 뜻입니다.

몇 가지 예시를 더 들자면,

R.*이라고 쓰면 R로 시작하는 목적지를 의미합니다.

.*\(Express\)는 (Express)로 끝나는 목적지입니다.

.+SB.+는 SB 앞뒤로 무언가가 반드시 붙어 있어야 한다는 뜻입니다.

[a-z_]+는 소문자와 _(언더바)로만 쓰여진 1글자 이상의 목적지입니다.

[A-Za-z]{3,7}은 알파벳으로 된 3에서 7글자 사이의 목적지입니다.

(TGR|MGFD)_FOX는 TGR_FOX나 MGFD_FOX입니다.

(null)은 진짜로 목적지가 null인 경우입니다.


Name, Rider도 동일 문법을 사용합니다. 다만 Name?= 은 뒤에 바로 카트의 이름으로 인식할 식을 쓰고, Rider는 Rider?=player: 혹은 Rider=named: 뒤에 써서 각각 탑승한 플레이어의 닉네임이나 탑승한 NPC의 이름을 인식합니다.


2018.02.04 추가 내용

https://regex101.com/와 같은 사이트에서 정규표현식을 테스트해 볼 수 있습니다.


강좌 종료.

+ Recent posts