이슈 상황 :

대화 스크립트 엑셀 파일에서 Command란에

 

$TokenType : Value $

를 작성하고 역직렬화 할때 , 파싱해서 사용을 하고 있다.

 

하지만 해당 문자열을 파싱할때 문제가 발생했다.

 

"$fade:true$ $duration:0.5$ $easygraph:4$"

 

fadeeasygraph는 토큰으로 인지하여 값을 분리했는데

duration value인 0.5가 값으로 안 읽히고 text 토큰 형태로 읽히는 문제가 발생했다.

 

원인 :

   private static readonly Regex TagRegex =
        new Regex(@"\$(\w+):(\w*)\$", RegexOptions.Compiled);

Command 문자열을 특정패턴으로 분리 할수있게 Regax를 사용하고 있다.

 

(\w*)

원인은 이 정규식(Regax) 때문이였다.

\w는 보통 영문자,숫자,밑줄(_)허용함,

예시 ) abc,A1,test_01 이런것만 정규식으로 인정이 된다는 것

0.5에는 점(.)이 있으므로 매칭이 되지 않는다. 

 

그렇기때문에 앞에 duration 토큰 탐색후 value값 탐색시에 조건이 안맞으므로

예외 처리로 text 토큰 처리를 하게 된것이다. 

 

해결 방법 : 

   private static readonly Regex TagRegex =
      new Regex(@"\$(\w+):([^$]*)\$", RegexOptions.Compiled);

 

(\w*) => ([^$]*)

로 정규식을 변경하였다.

 

[^$]* 해당 정규식을 사용한 의미

1. 값 부분은 $ 아니면 전부 허용

2. * 이므로 빈 문자열(공백)도 허용

 

예시 : 

$tag:0.5$
$tag:-1.25$
$tag:hello world$
$tag:50%$
$tag:test_01$
$tag:abc-def$
$tag:$

 

Value 부분에 어떤 값이 들어와도 해당 토큰에 따라 변경을 해놓게 해결하였다.

+ Recent posts