int GRegExp::longRes(GVector<GString> *res, unsigned int pos, unsigned int reg, GString &str) { if ( pos > str.Size() || res->Size() < reg) return -1; if (!res || res->Size() == reg) { if (this->_opt.Size() == 0 || (this->_opt.Size() > reg && (_opt[reg].getObliWord().Size() == 0))) { if (_opt.Size() != 0) { GString tmp = _opt[reg].getStopChar(); for (unsigned int i = pos; i < str.Size(); i++) for (unsigned int j = 0; j < tmp.Size(); j++) if (tmp[j] == str[i]) return -1; if (_opt[reg].getEmp() == NOEMPTY && (str.Size() - pos) == 0) return -1; return str.Size() - pos; } return str.Size() - pos; } return str.Size(); } if (this->_opt.Size() == 0 || (this->_opt.Size() > reg && (_opt[reg].getObliWord().Size() == 0))) { unsigned int i = pos; while (i < str.Size() - (*res)[reg].Size() + 1) { if (this->_opt.Size() > reg) { GString tmp = _opt[reg].getStopChar(); for (unsigned int j = 0; j < tmp.Size(); j++) { if (tmp[j] == str[i]) { if ((int)i - (int)pos < 0) return -1; else if (this->_opt.Size() == 0 || (this->_opt.Size() > reg && _opt[reg].getEmp() == EMPTY)) return i - pos; else if (i - pos > 0) return i - pos; return -1; } } } if (_opt.Size() > reg + 1 && _opt[reg + 1].getStopChar() == "" && _opt[reg + 1].getObliWord().Size() == 0) { if (_opt[reg].getStopChar().Size() == 0 && _opt[reg].getObliWord().Size() == 0) { unsigned int j = 0; while ((*res)[reg].Size() > j && (*res)[reg][j] == str[i + j]) j++; if (j == (*res)[reg].Size()) return i - pos; } i++; } else { unsigned int j = 0; if ((*res)[reg].Size() == 0) { if (this->_opt.Size() > reg && _opt[reg].getEmp() == NOEMPTY && (i - pos) > 0) { if (longRes(res, i, reg + 1, str) != -1) return i - pos; } else { if (this->_opt.Size() <= reg || (this->_opt.Size() > reg && _opt[reg].getEmp() == EMPTY)) return i - pos; } } else { while ((*res)[reg].Size() > j && (*res)[reg][j] == str[i + j]) j++; /* test fin avec (.*)t sans opt*/ if (j == (*res)[reg].Size()) { if (this->_opt.Size() > reg) { if ((_opt[reg].getEmp() == NOEMPTY && (i - pos) > 1) || _opt[reg].getEmp() == EMPTY) if ((reg + 1 < res->Size()) || (reg + 1 == res->Size() && str.Size() == i + (*res)[reg].Size())) return i - pos; } else { if ((reg + 1 < res->Size()) || (reg + 1 == res->Size() && str.Size() == i + (*res)[reg].Size())) return i - pos; } } } i++; } } return -1; } if (this->_opt.Size() > reg && _opt[reg].getObliWord().Size() > 0) { GVector<GString> tmp = _opt[reg].getObliWord(); for (unsigned int i = 0; i < tmp.Size(); i++) { if (tmp[i].Size() <= str.Size() + pos) { unsigned int j = 0; while (j < tmp[i].Size() && tmp[i][j] == str[pos + j]) j++; if (j == tmp[i].Size()) { if (reg == res->Size() && str.Size() == pos + j) return j; if (reg < res->Size()) { unsigned int k = 0; while (k < str.Size() && k < (*res)[reg].Size() && str[k + pos + j] == (*res)[reg][k]) k++; /*test fin de chaine */ if ((*res)[reg].Size() == k) return tmp[i].Size(); } } } } return -1; } return -1; }
GVector<GString> *GRegExp::pregMatch(GString &str) { str = BurnCorner(str); GString t = this->skipDouble(str); GStringList s = _preg.Explode("(.*)", G::KEEP_EMPTY_PARTS); GVector<GString> r; for (unsigned int i = 0; i < s.Size(); i++) { if (this->isPos(s[i], "(.*)") > -1) r+=GString(""); else r+=BurnCorner(GString(s[i])); } if (isNPos(_preg, "(.*)", _preg.Size() - 4) > 0) { r.Erase(r.Size() - 1); } GVector<GString> *res = new GVector<GString>; if (r.Size() < 1) { if (this->isContener(_preg, "(.*)")) { (*res)+= str; return res; } else { return NULL; } } unsigned int pos = 0; unsigned int reg = 0; if (!this->isContener(_preg, "(.*)")) { if (this->isContener(str,r[0])) { pos+=r[0].Size(); r.Erase(0); } else return NULL; } else { if (r.Size() > 0 && r[r.Size() - 1].Size() == 0) r.Erase(r.Size() - 1); } for (; reg < r.Size(); reg++) { int restmp = longRes(&r, pos, reg, str); if (restmp < 0) return NULL; GString mot = ""; for (unsigned int i = 0; i < (unsigned int)restmp; i++) mot += str[pos + i]; (*res)+= BurnCorner(mot); pos += restmp + r[reg].Size(); } if (reg == r.Size() && _preg.Size() > 4 && isNPos(_preg, "(.*)", _preg.Size() - 4) > 0) { int restmp; if (str.Size() == pos && (_opt.Size() == 0 || (_opt.Size() > reg && _opt[reg].getEmp() == EMPTY))) restmp = 0; else restmp = longRes(&r, pos, reg, str); if (restmp < 0) return NULL; if (pos + restmp > str.Size()) throw GException("Error RegExp"); GString mot = ""; for (unsigned int i = 0; i < (unsigned int)restmp; i++) mot += str[pos + i]; (*res)+= BurnCorner(mot); return res; } return res; }