string regex function added
This commit is contained in:
27
ml.cpp
27
ml.cpp
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user