1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-11 13:10:58 +00:00

Added global sub and bounds checking to RegEx

This commit is contained in:
Zher Huei Lee
2016-10-24 22:13:26 +01:00
parent 439d439321
commit c3b4686082
3 changed files with 54 additions and 19 deletions

View File

@@ -1340,6 +1340,12 @@ Error RegEx::compile(const String& p_pattern) {
Ref<RegExMatch> RegEx::search(const String& p_text, int p_start, int p_end) const {
ERR_FAIL_COND_V(!is_valid(), NULL);
ERR_FAIL_COND_V(p_start < 0, NULL);
ERR_FAIL_COND_V(p_start >= p_text.length(), NULL);
ERR_FAIL_COND_V(p_end > p_text.length(), NULL);
ERR_FAIL_COND_V(p_end != -1 && p_end < p_start, NULL);
Ref<RegExMatch> res = memnew(RegExMatch());
for (int i = 0; i < group_names.size(); ++i) {
@@ -1350,7 +1356,7 @@ Ref<RegExMatch> RegEx::search(const String& p_text, int p_start, int p_end) cons
res->string = p_text;
if (p_end < p_start || p_end > p_text.length())
if (p_end == -1)
p_end = p_text.length();
RegExSearch s(res, p_end, lookahead_depth);
@@ -1369,18 +1375,45 @@ Ref<RegExMatch> RegEx::search(const String& p_text, int p_start, int p_end) cons
return NULL;
}
String RegEx::sub(const String& p_text, const String& p_template, int p_start, int p_end) const {
String RegEx::sub(const String& p_text, const String& p_replacement, bool p_all, int p_start, int p_end) const {
Ref<RegExMatch> m = search(p_text, p_start, p_end);
RegExMatch::Group& s = m->captures[0];
if (s.start >= 0) {
String res = p_text.substr(0, s.start) + m->expand(p_template);
int end = s.start + s.length;
if (end < p_text.length())
res += p_text.substr(end, p_text.length() - end);
return res;
ERR_FAIL_COND_V(!is_valid(), p_text);
ERR_FAIL_COND_V(p_start < 0, p_text);
ERR_FAIL_COND_V(p_start >= p_text.length(), p_text);
ERR_FAIL_COND_V(p_end > p_text.length(), p_text);
ERR_FAIL_COND_V(p_end != -1 && p_end < p_start, p_text);
String text = p_text;
int start = p_start;
if (p_end == -1)
p_end = p_text.length();
while (start < text.length() && (p_all || start == p_start)) {
Ref<RegExMatch> m = search(text, start, p_end);
RegExMatch::Group& s = m->captures[0];
if (s.start < 0)
break;
String res = text.substr(0, s.start) + m->expand(p_replacement);
start = res.length();
if (s.length == 0)
++start;
int sub_end = s.start + s.length;
if (sub_end < text.length())
res += text.substr(sub_end, text.length() - sub_end);
p_end += res.length() - text.length();
text = res;
}
return p_text;
return text;
}
void RegEx::clear() {
@@ -1456,7 +1489,7 @@ void RegEx::_bind_methods() {
ObjectTypeDB::bind_method(_MD("clear"),&RegEx::clear);
ObjectTypeDB::bind_method(_MD("compile","pattern"),&RegEx::compile);
ObjectTypeDB::bind_method(_MD("search","text","start","end"),&RegEx::search, DEFVAL(0), DEFVAL(-1));
ObjectTypeDB::bind_method(_MD("sub","text","template","start","end"),&RegEx::sub, DEFVAL(0), DEFVAL(-1));
ObjectTypeDB::bind_method(_MD("sub","text","replacement","all","start","end"),&RegEx::sub, DEFVAL(false), DEFVAL(0), DEFVAL(-1));
ObjectTypeDB::bind_method(_MD("is_valid"),&RegEx::is_valid);
ObjectTypeDB::bind_method(_MD("get_pattern"),&RegEx::get_pattern);
ObjectTypeDB::bind_method(_MD("get_group_count"),&RegEx::get_group_count);