@@ -261,7 +261,19 @@ fn like_utf8_impl<OffsetSize: StringOffsetSizeTrait>(
261
261
let re = if let Some ( ref regex) = map. get ( pat) {
262
262
regex
263
263
} else {
264
- let re_pattern = pat. replace ( "%" , ".*" ) . replace ( "_" , "." ) ;
264
+ let mut prev_char = None ;
265
+ let mut re_pattern = pat. replace ( |c| {
266
+ let res = c == '%' && prev_char != Some ( '\\' ) ;
267
+ prev_char = Some ( c) ;
268
+ res
269
+ } , ".*" ) . replace ( "\\ %" , "%" ) ;
270
+
271
+ let mut prev_char = None ;
272
+ re_pattern = re_pattern. replace ( |c| {
273
+ let res = c == '_' && prev_char != Some ( '\\' ) ;
274
+ prev_char = Some ( c) ;
275
+ res
276
+ } , "." ) . replace ( "\\ _" , "_" ) ;
265
277
let re = RegexBuilder :: new ( & format ! ( "^{}$" , re_pattern) )
266
278
. case_insensitive ( !case_sensitive)
267
279
. build ( )
@@ -370,7 +382,19 @@ fn like_utf8_scalar_impl<OffsetSize: StringOffsetSizeTrait>(
370
382
}
371
383
}
372
384
} else {
373
- let re_pattern = right. replace ( "%" , ".*" ) . replace ( "_" , "." ) ;
385
+ let mut prev_char = None ;
386
+ let mut re_pattern = right. replace ( |c| {
387
+ let res = c == '%' && prev_char != Some ( '\\' ) ;
388
+ prev_char = Some ( c) ;
389
+ res
390
+ } , ".*" ) . replace ( "\\ %" , "%" ) ;
391
+
392
+ let mut prev_char = None ;
393
+ re_pattern = re_pattern. replace ( |c| {
394
+ let res = c == '_' && prev_char != Some ( '\\' ) ;
395
+ prev_char = Some ( c) ;
396
+ res
397
+ } , "." ) . replace ( "\\ _" , "_" ) ;
374
398
let re = RegexBuilder :: new ( & format ! ( "^{}$" , re_pattern) )
375
399
. case_insensitive ( !case_sensitive)
376
400
. build ( )
0 commit comments