@@ -1972,22 +1972,13 @@ Literal Literal::as_regex_matches(regex::Regex const &pattern, storage::DynNodeS
19721972}
19731973
19741974Literal Literal::as_regex_matches (Literal const &pattern, Literal const &flags, storage::DynNodeStoragePtr node_storage) const noexcept {
1975- if (this ->null ()) {
1976- return Literal{};
1977- }
1978-
1979- if (!this ->is_string_like () || !pattern.is_string_like () || !flags.is_string_like ()) {
1980- return Literal{};
1981- }
1982-
1983- if (pattern.datatype_eq <datatypes::rdf::LangString>() && this ->language_tag () != pattern.language_tag ()) {
1975+ if (this ->null () || !this ->is_string_like ()) {
19841976 return Literal{};
19851977 }
19861978
19871979 auto const re = [&]() noexcept -> std::optional<regex::Regex> {
19881980 try {
1989- auto const regex_flags = translate_regex_flags (flags.lexical_form ());
1990- return regex::Regex{pattern.lexical_form (), regex_flags};
1981+ return pattern.make_regex (flags);
19911982 } catch (std::runtime_error const &) {
19921983 return std::nullopt ;
19931984 }
@@ -2001,6 +1992,17 @@ Literal Literal::as_regex_matches(Literal const &pattern, Literal const &flags,
20011992 return Literal::make_boolean (res, select_node_storage (node_storage));
20021993}
20031994
1995+ regex::Regex Literal::make_regex (Literal const &flags) const {
1996+ if (this ->null () || !this ->datatype_eq <datatypes::xsd::String>()) {
1997+ throw std::runtime_error{" Literal cannot be converted for creating regex (null or not simple literal)" };
1998+ }
1999+ if (flags.null () || !flags.datatype_eq <datatypes::xsd::String>()) {
2000+ throw std::runtime_error{" Flags cannot be used for creating regex (null or not string-like)" };
2001+ }
2002+ auto const regex_flags = translate_regex_flags (flags.lexical_form ());
2003+ return regex::Regex{this ->lexical_form (), regex_flags};
2004+ }
2005+
20042006Literal Literal::regex_replace (regex::RegexReplacer const &replacer, storage::DynNodeStoragePtr node_storage) const {
20052007 if (!this ->is_string_like ()) {
20062008 return Literal{};
@@ -2013,18 +2015,13 @@ Literal Literal::regex_replace(regex::RegexReplacer const &replacer, storage::Dy
20132015}
20142016
20152017Literal Literal::regex_replace (Literal const &pattern, Literal const &replacement, Literal const &flags, storage::DynNodeStoragePtr node_storage) const {
2016- if (!this ->is_string_like () || !pattern.is_string_like () || !replacement.is_string_like () || !flags.is_string_like ()) {
2017- return Literal{};
2018- }
2019-
2020- if (pattern.datatype_eq <datatypes::rdf::LangString>() && this ->language_tag () != pattern.language_tag ()) {
2018+ if (this ->null () || !this ->is_string_like ()) {
20212019 return Literal{};
20222020 }
20232021
20242022 auto const re = [&]() noexcept -> std::optional<regex::Regex> {
20252023 try {
2026- auto const regex_flags = translate_regex_flags (flags.lexical_form ());
2027- return regex::Regex{pattern.lexical_form (), regex_flags};
2024+ return pattern.make_regex (flags);
20282025 } catch (std::runtime_error const &) {
20292026 return std::nullopt ;
20302027 }
0 commit comments