[FIX] too many characters are escaped, leading to an 'invalid regular expression: invalid escape \ sequence' error.

Escape only the list of characters that must be escaped according to POSIX-ARE
This commit is contained in:
Guewen Baconnier
2014-03-04 14:19:28 +01:00
parent c17afe17b1
commit 7ff26dbb35
2 changed files with 10 additions and 2 deletions

View File

@@ -319,9 +319,15 @@ class AccountStatementCompletionRule(orm.Model):
if not context['partner_memoizer']: if not context['partner_memoizer']:
return res return res
st_obj = self.pool.get('account.bank.statement.line') st_obj = self.pool.get('account.bank.statement.line')
# regexp_replace(name,'([^a-zA-Z0-9 -])', '\\\1', 'g'), 'i') escape the column name to avoid false positive. (ex 'jho..doe' -> 'joh\.\.doe' # The regexp_replace() escapes the name to avoid false positive
# example: 'John J. Doe (No 1)' is escaped to 'John J\. Doe \(No 1\)'
# See http://stackoverflow.com/a/400316/1504003 for a list of
# chars to escape. Postgres is POSIX-ARE, compatible with
# POSIX-ERE excepted that '\' must be escaped inside brackets according to:
# http://www.postgresql.org/docs/9.0/static/functions-matching.html
# in chapter 9.7.3.6. Limits and Compatibility
sql = """SELECT id FROM ( sql = """SELECT id FROM (
SELECT id, regexp_matches(%s, regexp_replace(name,'([^[:alpha:]0-9 -])', %s, 'g'), 'i') AS name_match FROM res_partner SELECT id, regexp_matches(%s, regexp_replace(name,'([\.\^\$\*\+\?\(\)\[\{\\\|])', %s, 'g'), 'i') AS name_match FROM res_partner
WHERE id IN %s) AS res_patner_matcher WHERE id IN %s) AS res_patner_matcher
WHERE name_match IS NOT NULL""" WHERE name_match IS NOT NULL"""
cr.execute(sql, (st_line['name'], r"\\\1", context['partner_memoizer'])) cr.execute(sql, (st_line['name'], r"\\\1", context['partner_memoizer']))

View File

@@ -36,6 +36,8 @@ NAMES_COMPLETION_CASES = [
name_completion_case("A.one SA", "A.one SA for line", True), name_completion_case("A.one SA", "A.one SA for line", True),
name_completion_case("Acsone SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", False), name_completion_case("Acsone SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", False),
name_completion_case("Acsone ([^a-zA-Z0-9 -]) SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", True), name_completion_case("Acsone ([^a-zA-Z0-9 -]) SA", "Line for Acsone ([^a-zA-Z0-9 -]) SA test", True),
name_completion_case(r"Acsone (.^$*+?()[{\| -]\) SA", r"Line for Acsone (.^$*+?()[{\| -]\) SA test", True),
name_completion_case("Acšone SA", "Line for Acšone SA test", True),
] ]