@@ -503,6 +503,25 @@ extension RegexTests {
503
503
parseTest ( #"[[:{]]"# , charClass ( charClass ( " : " , " { " ) ) )
504
504
parseTest ( #"[[:}:]]"# , charClass ( charClass ( " : " , " } " , " : " ) ) )
505
505
506
+ parseTest (
507
+ #"[:[:space:]:]"# ,
508
+ charClass ( " : " , posixProp_m ( . binary( . whitespace) ) , " : " )
509
+ )
510
+ parseTest (
511
+ #"[:a[:space:]b:]"# ,
512
+ charClass ( " : " , " a " , posixProp_m ( . binary( . whitespace) ) , " b " , " : " )
513
+ )
514
+
515
+ // ICU parses a custom character class if it sees any of its known escape
516
+ // sequences in a POSIX character property (though it appears to exclude
517
+ // character class escapes e.g '\d'). We do so for any escape sequence as
518
+ // '\' is not a valid character property character.
519
+ parseTest ( #"[:\Q:]\E]"# , charClass ( " : " , quote_m ( " :] " ) ) )
520
+ parseTest ( #"[:\a:]"# , charClass ( " : " , atom_m ( . escaped( . alarm) ) , " : " ) )
521
+ parseTest ( #"[:\d:]"# , charClass ( " : " , atom_m ( . escaped( . decimalDigit) ) , " : " ) )
522
+ parseTest ( #"[:\\:]"# , charClass ( " : " , " \\ " , " : " ) )
523
+ parseTest ( #"[:\:]"# , charClass ( " : " , " : " ) )
524
+
506
525
parseTest (
507
526
#"\D\S\W"# ,
508
527
concat (
@@ -2319,7 +2338,7 @@ extension RegexTests {
2319
2338
diagnosticTest ( #"\p{x=y}"# , . unknownProperty( key: " x " , value: " y " ) )
2320
2339
diagnosticTest ( #"\p{aaa(b)}"# , . unknownProperty( key: nil , value: " aaa(b) " ) )
2321
2340
diagnosticTest ( " [[:a():]] " , . unknownProperty( key: nil , value: " a() " ) )
2322
- diagnosticTest ( #"\p{aaa\p{b}}"# , . unknownProperty( key: nil , value: # "aaa\p{b"# ) )
2341
+ diagnosticTest ( #"\p{aaa\p{b}}"# , . unknownProperty( key: nil , value: " aaa " ) )
2323
2342
diagnosticTest ( #"[[:{:]]"# , . unknownProperty( key: nil , value: " { " ) )
2324
2343
2325
2344
// MARK: Matching options
0 commit comments