diff options
Diffstat (limited to 'modules/regex')
-rw-r--r-- | modules/regex/SCsub | 2 | ||||
-rw-r--r-- | modules/regex/doc_classes/RegEx.xml | 3 | ||||
-rw-r--r-- | modules/regex/doc_classes/RegExMatch.xml | 2 | ||||
-rw-r--r-- | modules/regex/regex.cpp | 99 | ||||
-rw-r--r-- | modules/regex/regex.h | 2 | ||||
-rw-r--r-- | modules/regex/register_types.cpp | 1 |
6 files changed, 37 insertions, 72 deletions
diff --git a/modules/regex/SCsub b/modules/regex/SCsub index 753650adcb..2afacc1d9c 100644 --- a/modules/regex/SCsub +++ b/modules/regex/SCsub @@ -7,7 +7,7 @@ env_regex = env_modules.Clone() if env["builtin_pcre2"]: thirdparty_dir = "#thirdparty/pcre2/src/" - thirdparty_flags = ["PCRE2_STATIC", "HAVE_CONFIG_H"] + thirdparty_flags = ["PCRE2_STATIC", "HAVE_CONFIG_H", "SUPPORT_UNICODE"] if env["builtin_pcre2_with_jit"]: thirdparty_flags.append("SUPPORT_JIT") diff --git a/modules/regex/doc_classes/RegEx.xml b/modules/regex/doc_classes/RegEx.xml index 3130c53331..c00fa96b2e 100644 --- a/modules/regex/doc_classes/RegEx.xml +++ b/modules/regex/doc_classes/RegEx.xml @@ -32,8 +32,7 @@ [codeblock] for result in regex.search_all("d01, d03, d0c, x3f and x42"): print(result.get_string("digit")) - # Would print 01 03 3f 42 - # Note that d0c would not match + # Would print 01 03 0 3f 42 [/codeblock] [b]Note:[/b] Godot's regex implementation is based on the [url=https://www.pcre.org/]PCRE2[/url] library. You can view the full pattern reference [url=https://www.pcre.org/current/doc/html/pcre2pattern.html]here[/url]. [b]Tip:[/b] You can use [url=https://regexr.com/]Regexr[/url] to test regular expressions online. diff --git a/modules/regex/doc_classes/RegExMatch.xml b/modules/regex/doc_classes/RegExMatch.xml index 151e881b6f..a45de60aef 100644 --- a/modules/regex/doc_classes/RegExMatch.xml +++ b/modules/regex/doc_classes/RegExMatch.xml @@ -49,7 +49,7 @@ </methods> <members> <member name="names" type="Dictionary" setter="" getter="get_names" default="{}"> - A dictionary of named groups and its corresponding group number. Only groups with that were matched are included. If multiple groups have the same name, that name would refer to the first matching one. + A dictionary of named groups and its corresponding group number. Only groups that were matched are included. If multiple groups have the same name, that name would refer to the first matching one. </member> <member name="strings" type="Array" setter="" getter="get_strings" default="[ ]"> An [Array] of the match and its capturing groups. diff --git a/modules/regex/regex.cpp b/modules/regex/regex.cpp index 25cc580591..50ca01067b 100644 --- a/modules/regex/regex.cpp +++ b/modules/regex/regex.cpp @@ -36,48 +36,43 @@ extern "C" { } static void *_regex_malloc(PCRE2_SIZE size, void *user) { - return memalloc(size); } static void _regex_free(void *ptr, void *user) { - memfree(ptr); } int RegExMatch::_find(const Variant &p_name) const { - if (p_name.is_num()) { - int i = (int)p_name; - if (i >= data.size()) + if (i >= data.size()) { return -1; + } return i; } else if (p_name.get_type() == Variant::STRING) { - const Map<String, int>::Element *found = names.find((String)p_name); - if (found) + if (found) { return found->value(); + } } return -1; } String RegExMatch::get_subject() const { - return subject; } int RegExMatch::get_group_count() const { - - if (data.size() == 0) + if (data.size() == 0) { return 0; + } return data.size() - 1; } Dictionary RegExMatch::get_names() const { - Dictionary result; for (const Map<String, int>::Element *i = names.front(); i != nullptr; i = i->next()) { @@ -88,13 +83,11 @@ Dictionary RegExMatch::get_names() const { } Array RegExMatch::get_strings() const { - Array result; int size = data.size(); for (int i = 0; i < size; i++) { - int start = data[i].start; if (start == -1) { @@ -111,16 +104,17 @@ Array RegExMatch::get_strings() const { } String RegExMatch::get_string(const Variant &p_name) const { - int id = _find(p_name); - if (id < 0) + if (id < 0) { return String(); + } int start = data[id].start; - if (start == -1) + if (start == -1) { return String(); + } int length = data[id].end - start; @@ -128,27 +122,26 @@ String RegExMatch::get_string(const Variant &p_name) const { } int RegExMatch::get_start(const Variant &p_name) const { - int id = _find(p_name); - if (id < 0) + if (id < 0) { return -1; + } return data[id].start; } int RegExMatch::get_end(const Variant &p_name) const { - int id = _find(p_name); - if (id < 0) + if (id < 0) { return -1; + } return data[id].end; } void RegExMatch::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_subject"), &RegExMatch::get_subject); ClassDB::bind_method(D_METHOD("get_group_count"), &RegExMatch::get_group_count); ClassDB::bind_method(D_METHOD("get_names"), &RegExMatch::get_names); @@ -163,28 +156,22 @@ void RegExMatch::_bind_methods() { } void RegEx::_pattern_info(uint32_t what, void *where) const { - if (sizeof(CharType) == 2) { - pcre2_pattern_info_16((pcre2_code_16 *)code, what, where); } else { - pcre2_pattern_info_32((pcre2_code_32 *)code, what, where); } } void RegEx::clear() { - if (sizeof(CharType) == 2) { - if (code) { pcre2_code_free_16((pcre2_code_16 *)code); code = nullptr; } } else { - if (code) { pcre2_code_free_32((pcre2_code_32 *)code); code = nullptr; @@ -193,7 +180,6 @@ void RegEx::clear() { } Error RegEx::compile(const String &p_pattern) { - pattern = p_pattern; clear(); @@ -202,7 +188,6 @@ Error RegEx::compile(const String &p_pattern) { uint32_t flags = PCRE2_DUPNAMES; if (sizeof(CharType) == 2) { - pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx; pcre2_compile_context_16 *cctx = pcre2_compile_context_create_16(gctx); PCRE2_SPTR16 p = (PCRE2_SPTR16)pattern.c_str(); @@ -220,7 +205,6 @@ Error RegEx::compile(const String &p_pattern) { } } else { - pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx; pcre2_compile_context_32 *cctx = pcre2_compile_context_create_32(gctx); PCRE2_SPTR32 p = (PCRE2_SPTR32)pattern.c_str(); @@ -241,17 +225,16 @@ Error RegEx::compile(const String &p_pattern) { } Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) const { - ERR_FAIL_COND_V(!is_valid(), nullptr); Ref<RegExMatch> result = memnew(RegExMatch); int length = p_subject.length(); - if (p_end >= 0 && p_end < length) + if (p_end >= 0 && p_end < length) { length = p_end; + } if (sizeof(CharType) == 2) { - pcre2_code_16 *c = (pcre2_code_16 *)code; pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx; pcre2_match_context_16 *mctx = pcre2_match_context_create_16(gctx); @@ -272,7 +255,6 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) result->data.resize(size); for (uint32_t i = 0; i < size; i++) { - result->data.write[i].start = ovector[i * 2]; result->data.write[i].end = ovector[i * 2 + 1]; } @@ -281,7 +263,6 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) pcre2_match_context_free_16(mctx); } else { - pcre2_code_32 *c = (pcre2_code_32 *)code; pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx; pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx); @@ -304,7 +285,6 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) result->data.resize(size); for (uint32_t i = 0; i < size; i++) { - result->data.write[i].start = ovector[i * 2]; result->data.write[i].end = ovector[i * 2 + 1]; } @@ -324,13 +304,14 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) _pattern_info(PCRE2_INFO_NAMEENTRYSIZE, &entry_size); for (uint32_t i = 0; i < count; i++) { - CharType id = table[i * entry_size]; - if (result->data[id].start == -1) + if (result->data[id].start == -1) { continue; + } String name = &table[i * entry_size + 1]; - if (result->names.has(name)) + if (result->names.has(name)) { continue; + } result->names.insert(name, id); } @@ -339,13 +320,13 @@ Ref<RegExMatch> RegEx::search(const String &p_subject, int p_offset, int p_end) } Array RegEx::search_all(const String &p_subject, int p_offset, int p_end) const { - int last_end = -1; Array result; Ref<RegExMatch> match = search(p_subject, p_offset, p_end); while (match.is_valid()) { - if (last_end == match->get_end(0)) + if (last_end == match->get_end(0)) { break; + } result.push_back(match); last_end = match->get_end(0); match = search(p_subject, match->get_end(0), p_end); @@ -354,7 +335,6 @@ Array RegEx::search_all(const String &p_subject, int p_offset, int p_end) const } String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_all, int p_offset, int p_end) const { - ERR_FAIL_COND_V(!is_valid(), String()); // safety_zone is the number of chars we allocate in addition to the number of chars expected in order to @@ -368,15 +348,16 @@ String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_a output.resize(olength + safety_zone); uint32_t flags = PCRE2_SUBSTITUTE_OVERFLOW_LENGTH; - if (p_all) + if (p_all) { flags |= PCRE2_SUBSTITUTE_GLOBAL; + } PCRE2_SIZE length = p_subject.length(); - if (p_end >= 0 && (uint32_t)p_end < length) + if (p_end >= 0 && (uint32_t)p_end < length) { length = p_end; + } if (sizeof(CharType) == 2) { - pcre2_code_16 *c = (pcre2_code_16 *)code; pcre2_general_context_16 *gctx = (pcre2_general_context_16 *)general_ctx; pcre2_match_context_16 *mctx = pcre2_match_context_create_16(gctx); @@ -397,11 +378,11 @@ String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_a pcre2_match_data_free_16(match); pcre2_match_context_free_16(mctx); - if (res < 0) + if (res < 0) { return String(); + } } else { - pcre2_code_32 *c = (pcre2_code_32 *)code; pcre2_general_context_32 *gctx = (pcre2_general_context_32 *)general_ctx; pcre2_match_context_32 *mctx = pcre2_match_context_create_32(gctx); @@ -422,25 +403,23 @@ String RegEx::sub(const String &p_subject, const String &p_replacement, bool p_a pcre2_match_data_free_32(match); pcre2_match_context_free_32(mctx); - if (res < 0) + if (res < 0) { return String(); + } } return String(output.ptr(), olength); } bool RegEx::is_valid() const { - return (code != nullptr); } String RegEx::get_pattern() const { - return pattern; } int RegEx::get_group_count() const { - ERR_FAIL_COND_V(!is_valid(), 0); uint32_t count; @@ -451,7 +430,6 @@ int RegEx::get_group_count() const { } Array RegEx::get_names() const { - Array result; ERR_FAIL_COND_V(!is_valid(), result); @@ -465,7 +443,6 @@ Array RegEx::get_names() const { _pattern_info(PCRE2_INFO_NAMEENTRYSIZE, &entry_size); for (uint32_t i = 0; i < count; i++) { - String name = &table[i * entry_size + 1]; if (result.find(name) < 0) { result.append(name); @@ -476,26 +453,20 @@ Array RegEx::get_names() const { } RegEx::RegEx() { - if (sizeof(CharType) == 2) { - general_ctx = pcre2_general_context_create_16(&_regex_malloc, &_regex_free, nullptr); } else { - general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr); } code = nullptr; } RegEx::RegEx(const String &p_pattern) { - if (sizeof(CharType) == 2) { - general_ctx = pcre2_general_context_create_16(&_regex_malloc, &_regex_free, nullptr); } else { - general_ctx = pcre2_general_context_create_32(&_regex_malloc, &_regex_free, nullptr); } code = nullptr; @@ -503,23 +474,21 @@ RegEx::RegEx(const String &p_pattern) { } RegEx::~RegEx() { - if (sizeof(CharType) == 2) { - - if (code) + if (code) { pcre2_code_free_16((pcre2_code_16 *)code); + } pcre2_general_context_free_16((pcre2_general_context_16 *)general_ctx); } else { - - if (code) + if (code) { pcre2_code_free_32((pcre2_code_32 *)code); + } pcre2_general_context_free_32((pcre2_general_context_32 *)general_ctx); } } void RegEx::_bind_methods() { - ClassDB::bind_method(D_METHOD("clear"), &RegEx::clear); ClassDB::bind_method(D_METHOD("compile", "pattern"), &RegEx::compile); ClassDB::bind_method(D_METHOD("search", "subject", "offset", "end"), &RegEx::search, DEFVAL(0), DEFVAL(-1)); diff --git a/modules/regex/regex.h b/modules/regex/regex.h index a342c17c78..52b49c783e 100644 --- a/modules/regex/regex.h +++ b/modules/regex/regex.h @@ -39,7 +39,6 @@ #include "core/vector.h" class RegExMatch : public Reference { - GDCLASS(RegExMatch, Reference); struct Range { @@ -70,7 +69,6 @@ public: }; class RegEx : public Reference { - GDCLASS(RegEx, Reference); void *general_ctx; diff --git a/modules/regex/register_types.cpp b/modules/regex/register_types.cpp index 77b19fa8f0..5d4aeba2d7 100644 --- a/modules/regex/register_types.cpp +++ b/modules/regex/register_types.cpp @@ -33,7 +33,6 @@ #include "regex.h" void register_regex_types() { - ClassDB::register_class<RegExMatch>(); ClassDB::register_class<RegEx>(); } |