string regex function added

This commit is contained in:
2021-10-26 22:02:40 +02:00
parent 8d90513a6b
commit 80d7935974
6 changed files with 93 additions and 5 deletions

27
ml.cpp
View File

@@ -1660,6 +1660,32 @@ MlValue string_regex(std::vector<MlValue> args, MlEnvironment &env) {
return MlValue(regexp_search(args[0].as_string(), args[1].as_string()));
}
// Returns found substrings of a regex
MlValue string_regex_list(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
bool match_mode = true;
bool ignore_case = false;
if (args.size() < 2 && args.size() > 4)
throw MlError(MlValue("string-regex-list", string_regex_list), env, args.size() > 4 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
if (args.size() >= 3) match_mode = args[2].as_string() == "match";
if (args.size() == 4) ignore_case = args[3].as_string() == "ignore";
auto found_matches = regexp_search2(args[0].as_string(), args[1].as_string(), match_mode, ignore_case);
std::vector<MlValue> list;
for(auto &l : found_matches) {
std::vector<MlValue> sublist;
for(auto &v : l) {
sublist.push_back(MlValue::string(v));
}
list.push_back(sublist);
}
return MlValue(list);
}
// Splits string by regexp and returns list containing splited parts
MlValue string_split(std::vector<MlValue> args, MlEnvironment &env) {
eval_args(args, env);
@@ -2087,6 +2113,7 @@ MlValue MlEnvironment::get(const std::string &name) const {
if (name == "string-replace") return MlValue("string-replace", builtin::string_replace);
if (name == "string-replace-re") return MlValue("string-replace-re", builtin::string_replace_re);
if (name == "string-regex?") return MlValue("string-regex?", builtin::string_regex);
if (name == "string-regex-list") return MlValue("string-regex?", builtin::string_regex_list);
if (name == "string-split") return MlValue("string-split", builtin::string_split);
if (name == "string-pad") return MlValue("string-pad", builtin::string_pad);
if (name == "string-rltrim") return MlValue("string-rltrim", builtin::string_rltrim);