@@ -51,14 +51,34 @@ public static KeywordList parse(String keywordString, Character delimiter, Chara
51
51
Objects .requireNonNull (delimiter );
52
52
Objects .requireNonNull (hierarchicalDelimiter );
53
53
54
- KeywordList keywordList = new KeywordList ();
54
+ List <String > keywords = new ArrayList <>();
55
+ StringBuilder current = new StringBuilder ();
56
+ boolean escaping = false ;
57
+
58
+ for (char ch : keywordString .toCharArray ()) {
59
+ if (escaping ) {
60
+ current .append (ch );
61
+ escaping = false ;
62
+ } else if (ch == '\\' ) {
63
+ escaping = true ;
64
+ } else if (ch == delimiter ) {
65
+ keywords .add (current .toString ().trim ());
66
+ current .setLength (0 );
67
+ } else {
68
+ current .append (ch );
69
+ }
70
+ }
55
71
56
- StringTokenizer tok = new StringTokenizer (keywordString , delimiter .toString ());
57
- while (tok .hasMoreTokens ()) {
58
- String chain = tok .nextToken ();
59
- Keyword chainRoot = Keyword .of (chain .split (hierarchicalDelimiter .toString ()));
72
+ if (current .length () > 0 ) {
73
+ keywords .add (current .toString ().trim ());
74
+ }
75
+
76
+ KeywordList keywordList = new KeywordList ();
77
+ for (String keyword : keywords ) {
78
+ Keyword chainRoot = Keyword .of (keyword .split (hierarchicalDelimiter .toString ()));
60
79
keywordList .add (chainRoot );
61
80
}
81
+
62
82
return keywordList ;
63
83
}
64
84
@@ -67,14 +87,18 @@ public static KeywordList parse(String keywordString, Character delimiter, Chara
67
87
*
68
88
* @param keywordString a String of keywordChains
69
89
* @param delimiter The delimiter used for separating the keywords
70
- * @return an parsed list containing the keywordChains
90
+ * @return a parsed list containing the keywordChains
71
91
*/
72
92
public static KeywordList parse (String keywordString , Character delimiter ) {
73
93
return parse (keywordString , delimiter , Keyword .DEFAULT_HIERARCHICAL_DELIMITER );
74
94
}
75
95
76
96
public static String serialize (List <Keyword > keywords , Character delimiter ) {
77
- return keywords .stream ().map (Keyword ::get ).collect (Collectors .joining (delimiter .toString ()));
97
+ return keywords .stream ()
98
+ .map (keyword -> keyword .get ()
99
+ .replace ("\\ " , "\\ \\ " ) // escape backslashes
100
+ .replace (delimiter .toString (), "\\ " + delimiter )) // escape delimiters
101
+ .collect (Collectors .joining (delimiter .toString ()));
78
102
}
79
103
80
104
public static KeywordList merge (String keywordStringA , String keywordStringB , Character delimiter ) {
0 commit comments