@@ -28,7 +28,6 @@ public class RolloverFilenameBuilder
2828 #region Fields
2929
3030 private string _condContent ;
31- private Group _condGroup ;
3231 private string _currentFileName ;
3332
3433 private Group _dateGroup ;
@@ -41,6 +40,7 @@ public class RolloverFilenameBuilder
4140
4241 private bool _hideZeroIndex ;
4342 private Group _indexGroup ;
43+ private Group _indexPartGroup ;
4444 private Regex _regex ;
4545
4646 #endregion
@@ -89,7 +89,7 @@ public void SetFileName (string fileName)
8989 Index = _indexGroup . Value . Length > 0 ? int . Parse ( _indexGroup . Value ) : 0 ;
9090 }
9191
92- _condGroup = match . Groups [ "cond " ] ;
92+ _indexPartGroup = match . Groups [ "indexPart " ] ;
9393 }
9494 }
9595
@@ -116,15 +116,15 @@ public string BuildFileName ()
116116
117117 if ( _indexGroup != null && _indexGroup . Success )
118118 {
119- fileName = fileName . Remove ( _indexGroup . Index , _indexGroup . Length ) ;
119+ fileName = fileName . Remove ( _indexPartGroup . Index , _indexPartGroup . Length ) ;
120120
121121 if ( ! _hideZeroIndex || Index > 0 )
122122 {
123123 var format = "D" + _indexGroup . Length ;
124- fileName = fileName . Insert ( _indexGroup . Index , Index . ToString ( format ) ) ;
124+ fileName = fileName . Insert ( _indexPartGroup . Index , Index . ToString ( format ) ) ;
125125 if ( _hideZeroIndex && _condContent != null )
126126 {
127- fileName = fileName . Insert ( _indexGroup . Index , _condContent ) ;
127+ fileName = fileName . Insert ( _indexPartGroup . Index , _condContent ) ;
128128 }
129129 }
130130 }
@@ -141,14 +141,14 @@ public string BuildFileName ()
141141 private void ParseFormatString ( string formatString )
142142 {
143143 var fmt = EscapeNonvarRegions ( formatString ) ;
144- var datePos = formatString . IndexOf ( "$D(" , StringComparison . Ordinal ) ;
144+ var datePos = fmt . IndexOf ( "$D(" , StringComparison . Ordinal ) ;
145145
146146 if ( datePos != - 1 )
147147 {
148- var endPos = formatString . IndexOf ( ')' , datePos ) ;
148+ var endPos = fmt . IndexOf ( ')' , datePos ) ;
149149 if ( endPos != - 1 )
150150 {
151- _dateTimeFormat = formatString . Substring ( datePos + 3 , endPos - datePos - 3 )
151+ _dateTimeFormat = fmt . Substring ( datePos + 3 , endPos - datePos - 3 )
152152 . ToUpperInvariant ( )
153153 . Replace ( 'D' , 'd' )
154154 . Replace ( 'Y' , 'y' ) ;
@@ -176,12 +176,17 @@ private void ParseFormatString (string formatString)
176176 }
177177 }
178178
179- fmt = fmt . Replace ( "*" , ".*" , StringComparison . Ordinal ) ;
179+ fmt = fmt . Replace ( "*" , ".*? " , StringComparison . Ordinal ) ;
180180 _hideZeroIndex = fmt . Contains ( "$J" , StringComparison . Ordinal ) ;
181- fmt = fmt . Replace ( "$I" , "(?'index'[\\ d]+)" , StringComparison . Ordinal ) ;
182- fmt = fmt . Replace ( "$J" , "(?'index'[\\ d]*)" , StringComparison . Ordinal ) ;
183-
184- _regex = new Regex ( fmt ) ;
181+ const string indexPattern = "(?'indexPart'(?'index'[\\ d]+))" ;
182+ const string hiddenZeroIndexPattern = "(?'indexPart'(?'index'[\\ d]*))" ;
183+ var conditionalIndexPattern = _condContent != null
184+ ? $ "(?'indexPart'(?:{ Regex . Escape ( _condContent ) } (?'index'[\\ d]+)|(?'index')))"
185+ : hiddenZeroIndexPattern ;
186+ fmt = fmt . Replace ( "$I" , indexPattern , StringComparison . Ordinal ) ;
187+ fmt = fmt . Replace ( "$J" , conditionalIndexPattern , StringComparison . Ordinal ) ;
188+
189+ _regex = new Regex ( fmt + @"\z" ) ;
185190 }
186191
187192 private string EscapeNonvarRegions ( string formatString )
@@ -199,17 +204,15 @@ private string EscapeNonvarRegions (string formatString)
199204 case 0 : // looking for $
200205 if ( fmt [ i ] == '$' )
201206 {
202- _ = result . Append ( Regex . Escape ( segment . ToString ( ) ) ) ;
203- segment = new StringBuilder ( ) ;
207+ AppendEscapedSegment ( result , segment ) ;
204208 state = 1 ;
205209 }
206210
207211 _ = segment . Append ( fmt [ i ] ) ;
208212 break ;
209213 case 1 : // the char behind $
210214 _ = segment . Append ( fmt [ i ] ) ;
211- _ = result . Append ( segment ) ;
212- segment = new StringBuilder ( ) ;
215+ AppendSegment ( result , segment ) ;
213216 state = 2 ;
214217 break ;
215218 case 2 : // checking if ( or other char
@@ -229,18 +232,30 @@ private string EscapeNonvarRegions (string formatString)
229232 _ = segment . Append ( fmt [ i ] ) ;
230233 if ( fmt [ i ] == ')' )
231234 {
232- _ = result . Append ( segment ) ;
233- segment = new StringBuilder ( ) ;
235+ AppendSegment ( result , segment ) ;
234236 state = 0 ;
235237 }
236238
237239 break ;
238240 }
239241 }
240242
243+ AppendEscapedSegment ( result , segment ) ;
241244 fmt = result . ToString ( ) . Replace ( '\xFFFD ' , '*' ) ;
242245 return fmt ;
243246 }
244247
248+ private static void AppendEscapedSegment ( StringBuilder result , StringBuilder segment )
249+ {
250+ _ = result . Append ( Regex . Escape ( segment . ToString ( ) ) ) ;
251+ _ = segment . Clear ( ) ;
252+ }
253+
254+ private static void AppendSegment ( StringBuilder result , StringBuilder segment )
255+ {
256+ _ = result . Append ( segment ) ;
257+ _ = segment . Clear ( ) ;
258+ }
259+
245260 #endregion
246- }
261+ }
0 commit comments