diff --git a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizer.java b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizer.java index ad4e8dd5..3b414b0a 100755 --- a/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizer.java +++ b/Batch/org.egovframe.rte.bat.core/src/main/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizer.java @@ -202,13 +202,13 @@ private int findCloseIndex(String line, String quoteCharacter, int beginIndex) { } private String getRegexDelimiter(String delimiter) { - delimiter = delimiter.replace("\\(", "\\\\("); - delimiter = delimiter.replace("\\)", "\\\\)"); - delimiter = delimiter.replace("\\{", "\\\\{"); - delimiter = delimiter.replace("\\}", "\\\\}"); - delimiter = delimiter.replace("\\^", "\\\\^"); - delimiter = delimiter.replace("\\[", "\\\\["); - delimiter = delimiter.replace("\\]", "\\\\]"); + delimiter = delimiter.replace("(", "\\("); + delimiter = delimiter.replace(")", "\\)"); + delimiter = delimiter.replace("{", "\\{"); + delimiter = delimiter.replace("}", "\\}"); + delimiter = delimiter.replace("^", "\\^"); + delimiter = delimiter.replace("[", "\\["); + delimiter = delimiter.replace("]", "\\]"); delimiter = delimiter.replace("*", "[*]"); delimiter = delimiter.replace("+", "[+]"); diff --git a/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizerMetaCharTest.java b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizerMetaCharTest.java new file mode 100644 index 00000000..69c7de3b --- /dev/null +++ b/Batch/org.egovframe.rte.bat.core/src/test/java/org/egovframe/rte/bat/core/item/file/transform/EgovEscapableDelimitedLineTokenizerMetaCharTest.java @@ -0,0 +1,37 @@ +package org.egovframe.rte.bat.core.item.file.transform; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * {@link EgovEscapableDelimitedLineTokenizer}가 정규식 메타문자를 구분자로 쓸 때 + * 이스케이프를 거쳐 리터럴로 분리되는지 검증한다. + * 같은 패키지의 {@link EgovDelimitedLineTokenizer}는 indexOf 로 분리하므로 + * 동일 입력에 대해 같은 결과가 나와야 한다. + */ +class EgovEscapableDelimitedLineTokenizerMetaCharTest { + + @Test + void doTokenize_metaCharDelimiter_splitsColumns() { + for (String delimiter : new String[]{"(", ")", "{", "}", "^", "[", "]"}) { + EgovEscapableDelimitedLineTokenizer tokenizer = new EgovEscapableDelimitedLineTokenizer(delimiter); + List tokens = tokenizer.doTokenize("a" + delimiter + "b" + delimiter + "c"); + assertEquals(List.of("a", "b", "c"), tokens, + "[" + delimiter + "] 구분자로 컬럼이 분리되어야 한다"); + } + } + + @Test + void doTokenize_metaCharDelimiter_matchesDelimitedLineTokenizer() { + for (String delimiter : new String[]{"(", ")", "{", "}", "^", "[", "]"}) { + String line = "a" + delimiter + "b" + delimiter + "c"; + List expected = new EgovDelimitedLineTokenizer(delimiter).doTokenize(line); + List actual = new EgovEscapableDelimitedLineTokenizer(delimiter).doTokenize(line); + assertEquals(expected, actual, + "[" + delimiter + "] 구분자 분리 결과가 EgovDelimitedLineTokenizer 와 같아야 한다"); + } + } +}