# file : tests/regex/testscript # license : MIT; see accompanying LICENSE file : replace-search : { $* abcbd /b/x/ >axcxd : all $* -ffo abcbd /b/x/ >axcbd : first-only $* -fnc abcbd /b/x/ >xx : no-copy : ecma-escape : { $* xay '/a/$b/' >'x$by' : none $* xay '/a/$/' >'x$y' : none-term $* xay '/a/$$/' >'x$y' : self $* xay '/a/b$&c/' >'xbacy' : match $* xay '/a/b$`c/' >'xbxcy' : match-precede $* xay "/a/b\\\$'c/" >'xbycy' : match-follow : capture : { $* abcdefghij '/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/$1$10/' >aj : matched $* a '/(a)|(b)/$1$2$3/' >a : unmatched } } : perl-escape : { $* xay '/a/\b/' >'xby' : none $* xay '/a/\/' >'xy' : none-term $* xay '/a/\\/' >'x\y' : self : newline : $* xay '/a/\n/' >>EOO x y EOO : capture : { $* abcdefghij '/(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\1\10/' >aa0 : matched $* a '/(a)|(b)/\1\2\3/' >a : unmatched } : upper : { $* xay '/a/\U/' >xy : none $* xay '/a/\Uvz/' >xVZy : repl $* xay '/a/\Uv\Ez/' >xVzy : end $* aa '/a/v\Uz/' >vZvZ : locality $* xay '/(a)/\U\1/' >xAy : capt $* x-y '/(a?)-/\U\1z/' >xZy : capt-empty $* xay '/a/\uvz/' >xVzy : once } : lower : $* xay '/a/\lVZ/' >xvZy } : empty-substring : : Note that the regex search-based replacement with the match_not_null flag : is broken for older versions of libstdc++ and libc++ (may ignore : match_not_null for the former and may hang for some string/pattern for the : latter). : if (($cxx.id != 'gcc' || $cxx.version.major >= 7) && \ ($cxx.id != 'clang' || $cxx.version.major >= 6)) { $* '' '/.*/x/' >'x' : empty $* a '/a*/x/' >'x' : match $* aa '/b*/x/' == 1 : no-match } } : replace-match : { test.options += -m $* abc '/a(b)c/x\1y/' >xby : match $* abcd '/a(b)c/x\1yd/' == 1 : no-match : empty-substring : { $* '' '/.*/x/' >'x' : empty $* a '/a*/x/' >'x' : match $* ab '/a(c*)(b)/\1\2/' >'b' : match-mid } } : invalid-regex-fmt : { test.arguments += '' # Note: we will fail before the matching. $* '' 2> 'no leading delimiter' != 0 : no-leading-delim $* '/a' 2> 'no delimiter after regex' != 0 : no-mid-delim $* '//' 2> 'empty regex' != 0 : no-regex $* '/a[b/c/' 2>~'/invalid regex.*/' != 0 : regex $* '/a/b' 2> 'no delimiter after replacement' != 0 : no-trailing-delim $* '/a/b/s' 2> 'junk after trailing delimiter' != 0 : junk }