forked from lix-project/lix
b8867a0239
The function 'builtins.split' takes a POSIX extended regular expression and an arbitrary string. It returns a list of non-matching substring interleaved by lists of matched groups of the regular expression. ```nix with builtins; assert split "(a)b" "abc" == [ "" [ "a" ] "c" ]; assert split "([ac])" "abc" == [ "" [ "a" ] "b" [ "c" ] "" ]; assert split "(a)|(c)" "abc" == [ "" [ "a" null ] "b" [ null "c" ] "" ]; assert split "([[:upper:]]+)" " FOO " == [ " " [ "FOO" ] " " ]; ```
48 lines
1.8 KiB
Nix
48 lines
1.8 KiB
Nix
with builtins;
|
|
|
|
# Non capturing regex returns empty lists
|
|
assert split "foobar" "foobar" == ["" [] ""];
|
|
assert split "fo*" "f" == ["" [] ""];
|
|
assert split "fo+" "f" == ["f"];
|
|
assert split "fo*" "fo" == ["" [] ""];
|
|
assert split "fo*" "foo" == ["" [] ""];
|
|
assert split "fo+" "foo" == ["" [] ""];
|
|
assert split "fo{1,2}" "foo" == ["" [] ""];
|
|
assert split "fo{1,2}" "fooo" == ["" [] "o"];
|
|
assert split "fo*" "foobar" == ["" [] "bar"];
|
|
|
|
# Capturing regex returns a list of sub-matches
|
|
assert split "(fo*)" "f" == ["" ["f"] ""];
|
|
assert split "(fo+)" "f" == ["f"];
|
|
assert split "(fo*)" "fo" == ["" ["fo"] ""];
|
|
assert split "(f)(o*)" "f" == ["" ["f" ""] ""];
|
|
assert split "(f)(o*)" "foo" == ["" ["f" "oo"] ""];
|
|
assert split "(fo+)" "foo" == ["" ["foo"] ""];
|
|
assert split "(fo{1,2})" "foo" == ["" ["foo"] ""];
|
|
assert split "(fo{1,2})" "fooo" == ["" ["foo"] "o"];
|
|
assert split "(fo*)" "foobar" == ["" ["foo"] "bar"];
|
|
|
|
# Matches are greedy.
|
|
assert split "(o+)" "oooofoooo" == ["" ["oooo"] "f" ["oooo"] ""];
|
|
|
|
# Matches multiple times.
|
|
assert split "(b)" "foobarbaz" == ["foo" ["b"] "ar" ["b"] "az"];
|
|
|
|
# Split large strings containing newlines. null are inserted when a
|
|
# pattern within the current did not match anything.
|
|
assert split "[[:space:]]+|([',.!?])" ''
|
|
Nix Rocks!
|
|
That's why I use it.
|
|
'' == [
|
|
"Nix" [ null ] "Rocks" ["!"] "" [ null ]
|
|
"That" ["'"] "s" [ null ] "why" [ null ] "I" [ null ] "use" [ null ] "it" ["."] "" [ null ]
|
|
""
|
|
];
|
|
|
|
# Documentation examples
|
|
assert split "(a)b" "abc" == [ "" [ "a" ] "c" ];
|
|
assert split "([ac])" "abc" == [ "" [ "a" ] "b" [ "c" ] "" ];
|
|
assert split "(a)|(c)" "abc" == [ "" [ "a" null ] "b" [ null "c" ] "" ];
|
|
assert split "([[:upper:]]+)" " FOO " == [ " " [ "FOO" ] " " ];
|
|
|
|
true
|